管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信;管道就是一种特殊的文件,数据在文件中是流动的,读取之后就自动消失,如果文件中没有数据则会阻塞。本章咱们就细讲匿名管道。
匿名管道和我们之前讲的有名管道还是有很大不同,它只适合通过 fork 创建父子进程之间使用。那既然是父子进程之间通信,那么就不需要两个文件来创建进程了,这里利用 fork 在.c 文件中分裂出父子进程即可实现;基本思路就是:父进程获取一对存放读写权限的fd,然后创建出子进程,父进程不需要读数据,即关闭读fd,写完数据后再关闭写;在子进程中会共享父进程的fd,子进程只需要读数据,先关闭写fd,读出数据后关闭读即可完成一次通信。详见如下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc,const char* argv[])
{
int fd[2];
//获取匿名管道的fd
if(pipe(fd))
{
perror("pipe");
return -1;
}
if(fork())
{
//父进程 负责写 关闭读
close(fd[0]);
while(1)
{
char buf[256];
printf(">>>>>");
scanf("%s",buf);
write(fd[1],buf,sizeof(buf));
if(0==strcmp("quit",buf))
{
printf("通信结束!\n");
break;
}
usleep(5000);
}
close(fd[1]);
}
else
{
close(fd[1]);
while(1)
{
char buf[256];
read(fd[0],buf,sizeof(buf));
printf("%s\n",buf);
if(0==strcmp("quit",buf))
{
printf("通信结束!\n");
break;
}
}
close(fd[0]);
}
return 0;
}
over