(匿名)管道

本文详细介绍了管道作为一种进程间通信机制的工作原理及使用方法。通过具体的C语言示例代码展示了如何创建管道、父子进程间的通信过程,并提供了模拟ls|wc -w命令组合的实现案例。

  (匿名)管道:一种进程间通信形式。把从一个进程连接到另一个进程的一个数据流成为一个管道(固定大小内核缓冲区)。
管道的限制:1、半双工(数据只能在一个方向流动)需要双方通信时,要建立两个管道;
      2、只能用于共同祖先进程(具有亲缘关系的进程)通信,通常一个管道由一个进程创建,然后调用fork。

例如:ls | wc -w :   ls进程将输出写到管道,wc进程从管道获取数据.

  #include<unistd.h>
   int pipe(int fd[2]);  // 创建管道,返回两个文件描述符,fd[0]表示读端,fd[1]表示写端.成功返回0,失败返回-1

 具体状态可以如下图:父进程创建管道后,调用fork,子进程的fd0 fd1 也指向了管道读写端

 1 #include<unistd.h>
 2 #include<sys/types.h>
 3 #include<sys/stat.h>
 4 #include<fcntl.h>
 5 #include<stdlib.h>
 6 #include<stdio.h>
 7 #include<errno.h>
 8 #include<string.h>
 9 
10 #include<signal.h>
11 #define ERR_EXIT(m)\
12     do\
13     {\
14         perror(m);\
15         exit(EXIT_FAILURE);\
16     }while(0)  //宏要求一条语句
17 int main(int argc,char*argv[])
18 {
19     int pipefd[2];
20     //创建管道
21     if(pipe(pipefd)==-1)
22         ERR_EXIT("pipe error");
23     pid_t pid;
24     if((pid=fork())==-1)
25         ERR_EXIT("fork error");
26     else if(pid==0){//子进程发送数据给父进程
27         close(pipefd[0]);
28         write(pipefd[1],"hello",5);
29         close(pipefd[1]);
30         exit(EXIT_SUCCESS);
31     }
32     close(pipefd[1]);
33     char buf[10];
34     read(pipefd[0],buf,10);
35     printf("buf=%s\n",buf);
36     close(pipefd[0]);
37     return 0;
38 }

 

  下面这个例子用pipe来模拟 ls | wc -w   :运行两个进程 ls进程 、 wc -w进程。      用子进程运行ls,写数据到管道。           父进程运行wc 从管道读数据

正常情况,ls输出到标准输出,因而需要先进行重定向(到管道写端)。输出到管道。  同理 wc也一样

 1 #include<unistd.h>
 2 #include<sys/types.h>
 3 #include<sys/stat.h>
 4 #include<fcntl.h>
 5 #include<stdlib.h>
 6 #include<stdio.h>
 7 #include<errno.h>
 8 #include<string.h>
 9 
10 #include<signal.h>
11 #define ERR_EXIT(m)\
12     do\
13     {\
14         perror(m);\
15         exit(EXIT_FAILURE);\
16     }while(0)  //宏要求一条语句
17 int main(int argc,char*argv[])
18 {
19     int pipefd[2];
20     if(pipe(pipefd)==-1)
21         ERR_EXIT("pipe error");
22     pid_t pid;
23     if((pid=fork())==-1)
24         ERR_EXIT("fork error");
25     else if(pid==0){
26         close(pipefd[0]);//关闭管道读端
27         dup2(pipefd[1],STDOUT_FILENO);//1指向pipefd[1], 1指向管道写端。  标准输出,输出到1;不管1指向哪,都记住输出到 1  .等效于close(oldfd); fcntl(oldfd, F_DUPFD, newfd);
28         close(pipefd[1]);
29         execlp("ls","ls",(char*)0,NULL);//若果调用失败将执行以下内容,ls 输出到管道写端
30         fprintf(stderr,"error ececutr ls\n");
31         exit(EXIT_SUCCESS);
32     }
33     close(pipefd[1]);//关闭管道写端
34     dup2(pipefd[0],STDIN_FILENO);
35     close(pipefd[0]);//标准输入是管道读端
36     execlp("wc","wc","-w",(char*)0,NULL);//从标准输入获取
37     fprintf(stderr,"error ececutr ls\n");
38     return 0;
39 }

 

  补充一个例子来说明文件描述符拷贝。

 1 #include<unistd.h>
 2 #include<sys/types.h>
 3 #include<sys/stat.h>
 4 #include<fcntl.h>
 5 #include<stdlib.h>
 6 #include<stdio.h>
 7 #include<errno.h>
 8 #include<string.h>
 9 
10 #include<signal.h>
11 #define ERR_EXIT(m)\
12     do\
13     {\
14         perror(m);\
15         exit(EXIT_FAILURE);\
16     }while(0)  //宏要求一条语句
17 int main(int argc,char*argv[])
18 {
19     close(0);//0和标准输入断开,0指向Makefile
20     open("Makefile",O_RDONLY);//Makefile作为标准输入
21     close(1);
22     open("Makefile2",O_WRONLY|O_CREAT|O_TRUNC,0644);//Makefile2作为标准输出
23     //拷贝makefile
24     execlp("cat","cat",(char*)0,NULL);//cat不带参数,表示将标准输入获取数据写入标准输出
25     return 0;
26 }

 

转载于:https://www.cnblogs.com/wsw-seu/p/8384295.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值