我正在浏览linux中的pipe(2)
系统调用示例,我是从tldp得到的:http://tldp.org/LDP/lpg/node11.html#SECTION00722000000000000000
当我们需要关闭子进程的输入时我们关闭子进程的fd(1) - 但是我们也应该关闭父进程的输出,即关闭父进程的fd(0),为什么要在这里使用else语句,在这种情况下,父级的fd(0)将仅在fork失败时关闭,我是否正确?
我觉得不应该有else
陈述,父母的输入和父母的输出都应该关闭,以便从孩子到父母的沟通正确吗?
答案 0 :(得分:0)
你不应该谈论孩子输入和父输出,看起来你指的是stdin
和stdout
,这不一定与管道阅读相同并写信道。
对于从子级到父级的通信,子级需要关闭管道的读取通道(示例中为fd[0]
),父级需要关闭管道的写入通道({ {1}})。
你的困惑似乎更多的是关于分叉而不是关于管道。
需要fd[1]
,因为我们需要在父级和子级中执行不同的代码。在分叉后,使用else
/ if
来区分每个进程中执行的代码是很常见的。请记住,else
返回两次:在父母和新生儿中。它返回父节点中子节点的pid,子节点返回0,所以我们用它来区分它们。
在您发布的示例中,如果fork(2)
失败,则会输入第一个fork(2)
并退出流程。否则,一对if
/ if
用于在每个进程中执行不同的代码。