C:pipe()和fork()

时间:2014-03-04 17:24:53

标签: c linux fork pipe

试图清除我对fork()和pipe()的理解。我知道pipe()是一种在两个进程之间传输数据的单向方法。如果在父进程中,我在两个整数数组上调用pipe(),然后我将它分叉,这是否有效地创建了两个允许我双向传输数据的管道? (即让父母从标准中读取并且孩子写入标准输出,或类似地让父母写入标准输出并且孩子从标准中读取?)

2 个答案:

答案 0 :(得分:6)

没有。拨打pipe()一次后,始终只有一个管道。但是,fork()所做的是它将包括文件描述符表在内的所有内容复制到子进程。因此父母和孩子都可以访问管道的唯一两端。这就是为什么你应该关闭父母和孩子的未使用的结尾,即如果你想写父母和读小孩,你应该关闭父母的fd[0]和孩子的fd[1] - 因为你只能在管道中从一侧推到另一侧!把它想象成一个真正的管道,如果你将水倒入管道的两端会发生什么。

答案 1 :(得分:5)

答案是" no"。 fork()的结果是pipe()返回的每个描述符都是重复的(即,像dup()),但管道本身对于父和子都是相同的管道。写入管道的写入端将使读取端的数据可用,但父节点和子节点具有相同的读取端。

如果您需要双向通信,可以拨打pipe()两次。或者,您可以调用socketpair()来创建一对支持双向通信的套接字。