www.pudn.com > pthread_examples.rar > pipecommu.c


#include  
#include  
 
main() 
{ 
	int pipe_fd[2]; 
	pid_t pid; 
	char r_buf[4]; 
	char** w_buf[256]; 
	int childexit = 0; 
	int i; 
	int cmd; 
	 
	memset(r_buf, 0, sizeof(r_buf)); 
 
	if(pipe(pipe_fd)<0) 
	{ 
		printf("pipe create error\n"); 
		return -1; 
	} 
	if((pid=fork()) == 0)  /*表示处理的是子进程*/ 
	//子进程:解析从管道中获取的命令,并作相应的处理 
	{ 
		printf("\n"); 
		close(pipe_fd[1]); /*关闭写管道*/ 
		sleep(2); 
		 
		while(!childexit) 
		{	 
			read(pipe_fd[0],r_buf,4); 
			cmd = atoi(r_buf); 
			if(cmd==0) 
			{ 
				printf("child: receive command from parent over\n now child process exit\n"); 
				childexit=1; 
			}			 
	        else if(handle_cmd(cmd)!=0) 
				return; 
			sleep(1); 
		} 
		close(pipe_fd[0]); 
		exit(); 
	} 
	else if(pid > 0)     /*表示处理的是父进程*/ 
	//parent: send commands to child 
	{ 
		/*往管道中写入四个命令*/ 
		close(pipe_fd[0]);  /*关闭写管道*/ 
 
		w_buf[0] = "003"; 
		w_buf[1] = "005"; 
		w_buf[2] = "777"; 
		w_buf[3] = "000"; 
		for(i=0;i<4;i++) 
		{  
			write(pipe_fd[1],w_buf[i],4); 
		} 
		close(pipe_fd[1]); 
	}	 
} 
//下面是子进程的命令处理函数(特定于应用): 
int handle_cmd(int cmd) 
{ 
	if((cmd<0)||(cmd>256)) 
	//suppose child only support 256 commands 
		{ 
			printf("child: invalid command \n"); 
			return -1; 
		} 
	printf("child: the cmd from parent is %d\n", cmd); 
	return 0; 
}