栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以在由同一父级(LINUX,POSIX)创建的两个子进程之间建立管道

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以在由同一父级(LINUX,POSIX)创建的两个子进程之间建立管道

本质上,这就是外壳程序构建重定向链的方式,即类似

ls | grep foo | sort | uniq

在Unix编程上有一些很棒的介绍性文本,其中通过本书实现了一个简单的shell。Shell的任务之一是重定向。其中一本书是Michael K.
Johnson和Erik W. Troan撰写的“ Linux Application Programming”。

本书的主页:http : //ladweb.net/

要为N个进程构建重定向链,您需要N-1个管道。对于每个重定向,请使用

pipe(intfds[2])
系统调用创建管道。在使用之后
fork()
,但在
execv
使用之前
dup2(int from, intto)
,将管道的一端“连接”到每个过程的标准输入(0)或标准输出。这是一个过于简化的代码,没有错误检查:

int pipe_A[2];int pipe_B[2];pipe(pipe_A);pipe(pipe_B);pid_t pid_A, pid_B, pid_C;if( !(pid_A = fork()) ) {    dup2(pipe_A[1], 1);     execv(...);}if( !(pid_B = fork()) ) {    dup2(pipe_A[0], 0);     dup2(pipe_B[1], 1);     execv(...);}if( !(pid_C = fork()) ) {    dup2(pipe_B[0], 0);     execv(...);}

请注意,如果将管道的数组索引用于stdio重定向,则选择它们的方式应反映标准的输入/输出文件描述符。这个选择不是任意的。

当然,您可以将管道连接到任何文件描述符(例如,有些应用程序期望它们的父级打开,例如连接到管道的fd
3和4),并且大多数shell也直接支持此操作(例如1>&3将重定向)进入fd 3)。但是,数组的索引

pipe(intfds[2])
当然是0和1。我之所以这样说,是因为我有一些对货物狂热编程的学生,他们盲目地将目标fds也用于管道syscall数组。

waitpid(-1, NULL,0)
等待所有子进程完成使用–我认为这是我的预答器-1的意思,这意味着:等待所有子进程完成。另一个选择是
wait()
在循环中调用,该循环将返回刚终止的孩子的pid。如果再次调用它,并且仍然有一个孩子在奔跑,它将再次阻塞。如果没有孩子,则返回-1;否则,返回-1。我更喜欢
waitpid
解决方案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/408729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号