Linux中的管道pipe----管道的四种情况和特点
Linux中的管道pipe----管道的四种情况和特点
管道(pipe)----是用来支持两个或多个进程间进行进程间通信(IPC)进程间通信(IPC)----每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核。不同进程看到的公共资源是由操作系统(OS)提供的。管道(pipe)函数原型为: int pipe(int pipefd[2]) pipefd[2]为输出型参数,是一个数组,存放打开的两个文件描述符。一般情况下,文件描述符0、1、2为标准输入输出错误,pipefd[0]打开文件描述符3,pipefd[1]打开文件描述符4。0、1下标分别对应管道的读端和写端。管道的特点:(1)管道适用于单向通信,防止用户误操作;(2)管道目前只用于具有血缘关系的进程,常用于父子进程;(3)管道的生命周期是:随进程,管道是文件,在进程退出时文件销毁,管道也销毁;(4)管道是基于字节流的通信方式;(5)管道内部已经实现了同步,具有数据一致性;下面是在Linux下的一个管道程序,我们创建一个进程,让子进程写,父进程读。父子进程同时有读端和写端,所以需要各自关闭一端。1 #include
2 #include
3 #include
4 #include
5 int main()
6 {
7 int fds[2];
8 if(pipe(fds)<0)
9 {
10 perror("pipe");
11 return 1;
12 }
13 printf("fds0:%d,fds1:%d\n",fds[0],fds[1]);
14
15 pid_t id=fork();
16 if(id==0)
17 {
18 close(fds[0]); //子进程关闭读端
19 const char* child="hello father,i am child!";
20 int i=0;
21 while(i<10) //只写入10次数据
22 {
23 sleep(1);
24 printf("child run...!,%d\n",i);
25 write(fds[1],child,strlen(child));
26 i++;
27 }
28 exit(0);
29 }
30 else
31 {
32 close(fds[1]); //父进程关闭写端
33 char buf[1024];
34 while(1)
35 {
36 ssize_t s=read(fds[0],buf,sizeof(buf)-1); //读成