环保网站可以做哪些内容,怎么做农家乐联盟网站,深圳网站建设公司麦,做企业策划的公司管道#xff0c;其本质是一个伪文件#xff08;实为内核缓冲区#xff09;#xff1b;由两个文件描述符引用#xff0c;一个表示读端、一个表示写端#xff1b;规定数据从管道的写端流入#xff0c;读端流出。 管道的原理#xff1a;管道实为内核使用环形队列机制… 管道其本质是一个伪文件实为内核缓冲区由两个文件描述符引用一个表示读端、一个表示写端规定数据从管道的写端流入读端流出。 管道的原理管道实为内核使用环形队列机制借助内核缓冲区(4k)实现。 必须用于有血缘关系的进程 管道的局限性 ① 数据自己读不能自己写。 ② 数据一旦被读走便不在管道中存在不可反复读取。 ③ 由于管道采用半双工通信方式。因此数据只能在一个方向上流动。 ④ 只能在有公共祖先的进程间使用管道。 常见的通信方式有单工通信、半双工通信、全双工通信。 pipe创建管道 int pipe(int pipefd[2]); 成功0失败-1设置errno 函数调用成功返回r/w两个文件描述符。无需open但需手动close。规定fd[0] → r fd[1] → w就像0对应标准输入1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。 示例 1 #include stdio.h2 #include unistd.h3 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(----\n); //读完
27 }
28 write(STDOUT_FILENO,buf, ret); //写到屏幕
29 }else{ //父进程 关闭读端
30 close(fd[0]);
31 char *str hello pipe\n;
32 write(fd[1],hello pipe\n, strlen(hello pipe\n));
33 }
34 return 0;
35 } 转载于:https://www.cnblogs.com/lr1402585172/p/10512838.html