管道

管道,其本质是一个伪文件(实为内核缓冲区);由两个文件描述符引用,一个表示读端、一个表示写端;规定数据从管道的写端流入,读端流出。

  管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

  必须用于有血缘关系的进程

  

  管道的局限性:

  ① 数据自己读不能自己写。

  ② 数据一旦被读走,便不在管道中存在,不可反复读取。

  ③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

  ④ 只能在有公共祖先的进程间使用管道。

  常见的通信方式有,单工通信、半双工通信、全双工通信。

pipe,创建管道

  int pipe(int pipefd[2]);  成功:0;失败:-1,设置errno

  函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] rfd[1] w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。

示例:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 int main(void)
 5 {
 6     int fd[2];
 7     pid_t pid;
 8     
 9     int ret = pipe(fd);     //定义管道  父进程占用两端
10     if(ret == -1)
11     {
12         perror("pipe error");
13         exit(1);
14     }
15     pid = fork();
16     if(pid == -1)
17     {
18         perror("fork error");
19         exit(1);
20     }else if(pid == 0)//子进程(也占用了两端)    子进程读,将写端关闭    默认0读   1写
21     {
22         close(fd[1]);
23         char buf[1024];
24         ret read(fd[0], buf, sizeof(buf));    //将管道看作文件操作
25         if(ret == 0){
26             printf("----
");    //读完
27         }
28         write(STDOUT_FILENO,buf, ret);    //写到屏幕
29     }else{    //父进程   关闭读端
30         close(fd[0]);
31         char *str = "hello pipe
";
32         write(fd[1],"hello pipe
", strlen("hello pipe
"));
33     }
34     return 0;
35 }
原文地址:https://www.cnblogs.com/lr1402585172/p/10512838.html