【问题标题】:Why cant a pipe created using pipe() be used as a bi-directional pipe?为什么使用 pipe() 创建的管道不能用作双向管道?
【发布时间】:2012-04-25 20:49:26
【问题描述】:

我看到的几乎所有pipe 示例都建议关闭未使用的写入/读取结束。还有人明确指出pipe() creates a pipe, a unidirectional data channel 但我已经尝试在父母和孩子的管道两端进行读写,一切似乎都很好。

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

【问题讨论】:

  • 因为最先实现 pipe() 的人把它做成了单向的,然后成为了后续实现的标准。 (请注意,在某些操作系统的 pipe() 上确实为您提供了双向流,而另一些则没有)。如果需要双向通信,只需使用 2 个管道或使用 socketpair()。
  • 首先实现 pipe() 的人只为管道配备了一个缓冲区,类似于现实世界中用于流体/气体输送的管道。对于双缓冲区,请参阅套接字。
  • Solaris 的管道是双向的。并不是说很多人都在使用 Solaris……只是把它扔在那里。但是,正如其他人已经明确指出的那样,如果你想要可移植性,你不应该假设这种能力。

标签: c ipc pipe interprocess


【解决方案1】:

如果您使用相同的管道,子级如何将其消息与父级消息分开,反之亦然?

例如:

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

将一个管道用于child->parent,将另一个管道用于parent->child。

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

【讨论】:

  • 这个 QA 应该是介绍管道是什么时的上下文...
【解决方案2】:

可以在创建的管道的两端进行读写,但单向意味着数据在任何时候只能沿一个方向传输 em>,从父母到孩子,反之亦然。非阻塞发送和接收数据需要两个管道,这意味着您可以使用两个管道同时读取和写入,但是使用一个管道您必须先完成读取才能写入管道,否则您必须完成写入在您阅读管道之前。 用外行的话来说,你只能在任何时间点用一根管道读取或写入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2020-08-01
    • 2021-02-21
    相关资源
    最近更新 更多