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

4
我看过的几乎所有与pipe有关的示例都建议关闭未使用的写入/读取端。手册也明确说明了pipe()创建了一个单向数据通道。但是,我尝试在管道的双端(父进程和子进程)进行读写操作,一切似乎都很正常。

我的疑问是:如果两个进程都需要读写彼此的数据,为什么我们需要两个管道呢?为什么不使用一个管道呢?


1
因为最初实现pipe()的人将其设置为单向,这随后成为了后续实现的标准。(请注意,在某些操作系统上,pipe()确实会给您提供双向流,而在其他操作系统上则不会)。如果需要双向通信,只需使用2个管道或使用socketpair()即可。 - nos
最初实现pipe()的人员只为其配备了一个单一缓冲区,类似于用于流体/气体输送的真实管道。如需双缓冲区,请参见套接字。 - jørgensen
Solaris的管道是双向的。虽然现在使用Solaris的人不是很多,但是我想提一下。但正如其他人已经明确指出的那样,如果您想要可移植性,则不应假定该功能。 - FatalError
2个回答

8
如果使用同一个管道,子进程如何将其消息与父进程的消息分开,反之亦然?
例如:
Parent writes to pipe
Parent reads from pipe hoping to get message from child but gets its own message :(

使用一个管道来实现子进程到父进程间的通信,再使用另一个管道实现父进程到子进程间的通信,会更加容易。即使你有某些读写协议,也很容易造成父子进程死锁。


在介绍管道是什么之前,这个QA应该作为上下文。 - n611x007

5
您可以在创建的管道两端读写,但是单向意味着数据始终只能以单一方向传输,从父进程到子进程或者子进程到父进程。为了实现非阻塞发送和接收数据,需要使用两个管道,这意味着您可以同时使用两个管道进行读写操作,但是如果只有一个管道,则必须在写入管道之前完成读取,或者在读取管道之前先完成写入某些内容。简单来说,使用一个管道时,您只能在任何时候读或写其中一个方向的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接