是否有可能在由同一个父母创建的两个子公司之间进行运河 /LINUX, POSIX/

我有几个子公司 "forked" 来自同一个父级,我正在尝试建立一个连接
pipe

在所有这些子进程之间,作为关联列表的结构。 孩子 1 送孩子data2,宝贝 2 孩子们 3.... 孩子们为孩子 1. 有没有正确的方法来做呢?

此外,如果我在进程之间创建和通信,因为我强制我的父级 "wait" 完成他们的工作以来
wait//

或者
waitpid//

它正在等待第一个完成的过程,但我需要等待他们。 另一个问题出现了。

谢...
已邀请:

诸葛浮云

赞同来自:

从本质上讲,这就是制造的 shell, 如果你建立了一系列重定向,那就是这样的东西


ls | grep foo | sort | uniq


编程有几个优秀的输入文本。 Unix, 在哪个简单 shell 通过书实施。 和其中一个任务shell重定向。 其中一个书籍 - " 41 " Michael K. Johnson和Erica W. Trois。

主页书籍:
http://ladweb.net/
/

建立一个重定向链 N 您需要的流程 N-1 渠道。 对于每个重定向,您可以使用系统调用创建频道。
pipe/int fds[2]/

. 后
fork//

ing, 但之前
execv

ing 使用
dup2/int from, int to/

-"connect" 管道的末端到标准入口 /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/; /* redirect standard output to pipe_A write end */
execv/.../;
}

if/ !/pid_B = fork/// / {
dup2/pipe_A[0], 0/; /* redirect standard input to pipe_A read end */
dup2/pipe_B[1], 1/; /* redirect standard output to pipe_B write end */
execv/.../;
}

if/ !/pid_C = fork/// / {
dup2/pipe_B[0], 0/; /* redirect standard input to pipe_B read end */
execv/.../;
}


请注意,选择频道阵列索引以这样的方式选择它们反映标准输入描述符/输出文件如果用于重定向 stdio. 这种选择不是任意的。

当然,您可以将通道连接到任何文件描述符。 /例如,有一些应用程序期望他们的父母将打开,例如, fd 3 和 4, 连接到管道/, 而且大多数贝壳也直接支持它 /例如, 1>&3 重定向 stdout 在 fd 3/. 但是数组指数
pipe/int fds[2]/

, 当然,平等 0 和 1. 我只是告诉它,因为我有几个学生 cargo-cult-programming, 谁不安全地拿走了目标 fds 也适用于massiva. pipe syscall.

等待完成所有子流程,使用
waitpid/-1, NULL, 0/

– 我觉得它是 -1, 这意味着我的意见,这意味着:等待所有子公司的完成。 另一种选择是挑战
wait//

在一个循环中会返回 pid 新完成的子元素。 如果再次调用它,并且子仍然有效,它将再次被阻止。 如果孩子没有离开,他会回来 -1; 我更喜欢决定
waitpid

.

莫问

赞同来自:

是的,它很简单,你只需要在父元素中创建所有管道,不要忘记关闭管道 / 管元素中的管端/ren/, 你不需要。

离开 FDs 管道在不使用它们的儿童开放 - 这是 FAIL, 因为它可以让别人等待管道的尽头。 所有作家必须在读者收到之前关闭 EOF.

董宝中

赞同来自:

首先创建所有管道,然后引发所有后代的管道 FDs 0 和 1.

至于等待,只需等到他返回 -1.

要回复问题请先登录注册