1、管道的概念管道,又称“无名管理”,或“无名管道”,管道是一种非常基础且经常使用的IPC方式。1、管道的本质管道的本质也是一种文件,只不过是一种伪文件。它实际上是一个大小为4K的内核缓冲区;创建管道后,会生成两个文件描述符,一个是读端,一个是写端;管道中的数据只能从写端写入,从读端读取;1.流水线原理流水线是内核的一个缓冲区,更具体地说,它是一个循环队列。数据从队列的一端写入,从另一端读取,如下图所示:3.管道的优点是简单4.管道的缺点只能是单向通信。如果需要双向通信,需要建立两条管道;只能用于有血缘关系的进程,比如父子进程;缓冲区大小有限,一般为1页,即4k;2.管道创建管道创建三步:父进程调用pipe函数创建管道;父进程调用fork函数创建子进程;父进程关闭fd[0],子进程关闭fd[1];具体如下图所示:3.pipeline的读写行为pipeline的buffersize固定为4k,所以如果pipeline中的数据已经满了,那么就没有更多的数据可以写入了,write进程的调用将阻塞,直到有足够的空间写入数据;管道的读取动作比写入动作快,一旦数据被读取,管道将释放相应的空间用于后续的数据写入。读取完所有数据后,进程的read()调用将阻塞,直到再次写入数据。4.常规父子通信:#include#include#include#includeintmain(){intfd[2];pid_tpid;charbuf[1024];char*data="helloworld!";/*创建管道*/if(pipe(fd)==-1){printf("ERROR:pipecreatefailed!\n");return-1;}pid=fork();if(pid==0){/*subprocess*/close(fd[1]);//subprocess读取数据并关闭写端read(fd[0],buf,sizeof(buf));//从管道中读取数据printf("childprocessread:%s\n",buf);close(fd[0]);}elseif(pid>0){/*parentprocess*/close(fd[0]);//父进程写入数据,关闭读取器write(fd[1],data,strlen(data));//向管道写入数据printf("parentprocesswrite:%s\n",data);close(fd[1]);}return0;}兄弟之间的通信:#include#include#include#include#includeintmain(){intfd[2];inti=0;pid_tpid;charbuf[1024];char*data="helloworld!";/*创建管道*/if(pipe(fd)==-1){printf("ERROR:pipecreatefailed!\n");return-1;}for(i=0;i<2;i++){pid=fork();if(pid==-1){printf("错误:分叉错误!\n");返回-1;}elseif(pid==0){break;}}/*用i判断创建的子进程和父进程*/if(i==0){/*第一个子进程,兄弟进程*/close(fd[0]);//大哥进程向小进程写数据,关闭读端write(fd[1],data,strlen(data));printf("elderbrothersend:%s\n",data);close(fd[1]);}elseif(i==1){/*二子进程,兄弟进程*/close(fd[1]);read(fd[0],buf,sizeof(buf));printf("youngerbrotherreceive:%s\n",buf);close(fd[0]);}else{/*父进程*/close(fd[0]);close(fd[1]);for(i=0;i<2;i++){wait(NULL);}}return0;}本文经授权转载自公众号《良旭Linux》500强Linux开发工程师良旭外企,在公众号分享了很多Linux干货,欢迎关注!