Linux编程 进程间通信------无名管道(PIPE)

无名管道(PIPE)只是用于父子进程间通讯

PIPE是Linux进程间通信方法之一,是一个单向通道,先进先出,管道的尾端为写端,描述符pipe_fd[1] . 头部为读端,描述符为pipe_fd[0](注意,强制规定)


主要函数 :pipe(pipe_fd) //创建无名管道

下面介绍一个小例子:

程序功能:在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道

源码:

#include
#include
#include
#include
#include
#include
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
/*创建管道*/
 if(pipe(pipe_fd)<0)
 {
	printf(pipe create error\ n")∶
	return 1;
 }
/*创建子进程*/
 if((pid=fork())==0) //子进程执行序列
 {
	pontf("\n");
	dose(pipe_fd[1]); //子进程先关闭了管道的写端
	sleep(2); //让父进程先运行,这样父进程先写子进程才有内容读
  if(r_num=read(pipe_fd[0],buf_r,100))>0)
  {
	printf("%d numbers read from the plpe is %s\n",r_num,buf_r);
  }
	close(pipe_fe[0]);
	exit(0);
 }
 else if(pid>0) //父进程执行序列
 {
	close(pipe_fd[0]); //父进程先:关闭了管道的读端
	if(write(pipe_fd[1],"Hello",5)!=-1)
		printf("parent write 1 Hello!\n");
	if(write(pipe_fd[1],"Pipe",5)!=-1)
		printf("parent write 2 Pipe!\n");
	close(pipe_fd[1]);
	waitpid(pid,NULL,0); //等待子进程结束
	exit(0);
 }
 return O;
}
结果:

上述代码中父进程关闭管道的读端,子进程关闭管道的写端(想想为什么这么做???)

答:由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最好关闭掉读端,读的进程最好关闭掉写端。再来看代码:我们是从父进程向子进程写数据,所以我们关闭了子进程的写端pipe_fd[1]和父进程的读端pipe_fd[0]


你可能感兴趣的:(Linux编程,进程间通信)