C:pipe()和fork()

0 c linux fork pipe

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

Xuf*_*eng 6

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


jxh*_*jxh 5

答案是不”。的结果fork()是,返回的每个描述符pipe()都是重复的(例如dup()),但是对于父级和子级而言,管道本身都是相同的管道。写入管道的写入端将使数据在读取端可用,但是父级和子级具有相同的读取端。

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