为什么使用pipe()创建的管道不能用作双向管道?

问题描述:

几乎所有pipe示例我看到关闭未使用的写入/读取结束的建议。也有人明确指出,pipe() creates a pipe, a unidirectional data channel但我已经尝试读和写在父母和孩子的管道两端,一切似乎都没问题。为什么使用pipe()创建的管道不能用作双向管道?

所以我的疑问是,为什么我们需要2管道,如果两个进程必须读取和写入对方,为什么不使用单个管道呢?

+1

因为首先实现pipe()的人使它成为单向的,这成为后续实现的标准。 (请注意,在某些操作系统的管道()上会给你一个双向流,而另一些则不会)。如果需要双向通信,只需使用2个管道或使用socketpair()。 – nos 2012-04-13 13:35:26

+0

首先实现管道()的家伙只配备了一个缓冲管道,类似于流体/气体输送的真实管道。对于双缓冲区,请参阅套接字。 – 2012-04-13 13:50:56

+0

Solaris管道是双向的。并不是很多人都在使用Solaris,只是把它扔到那里。但是,正如其他人已经明确表示的那样,如果你想要可移植性,你就不应该假设这种能力。 – FatalError 2012-04-13 13:53:46

如果使用相同的管道如何孩子从父母信息中分离出来的消息,反之亦然写?

例如:

Parent writes to pipe 
Parent reads from pipe hoping to get message from child but gets its own message :(

这是很容易使用的儿童安全>家长一个管和父 - >儿童的另一个管道。

即使您有一些读/写协议,也很容易使父进程和子进程死锁。

+0

这个质量保证应该是在介绍什么管道时的背景...... – n611x007 2013-09-16 10:22:23

可以读和写在所创建的管的两端,但单向意味着只有数据随时在一个方向上行进,从父到子,或反之亦然。需要两个管道来实现非阻塞的数据发送和接收,这意味着您可以同时读取和写入两个管道,但是只有一个管道必须先完成读取,然后才能写入管道,或者您必须完成一些写操作然后才能阅读管道。 在通俗地说,你只能读取或在任何时间点只有一个管

+0

谢谢!这里是新的,不确定格式 – 2012-04-13 13:51:45