unix 管道是不是仅限于在 2 个进程之间使用?

Posted

技术标签:

【中文标题】unix 管道是不是仅限于在 2 个进程之间使用?【英文标题】:Is unix pipe limited to use only between 2 processes?unix 管道是否仅限于在 2 个进程之间使用? 【发布时间】:2014-07-14 17:26:22 【问题描述】:

我正在阅读 UNIX 中用于 2 个进程之间的进程间通信的管道。我有以下问题。

1) Unix 管道是否仅限于在 2 个进程之间使用,还是我们可以使用 3 个或更多相关进程使用单个管道进行通信?例如,如果我有一个父进程和 2 个子进程,我可以使用管道从父进程写入,我可以使用相同的管道从两个子进程读取吗?如果是这种情况,两个孩子将如何获得相同的内容,因为 如果一个孩子从管道中读取,数据将被内核从管道中删除?

2) 真的有必要关闭管道未使用的一端吗?例如,如果我的父进程正在将数据写入管道而子进程正在从管道中读取,那么是否真的有必要在父进程中关闭管道的读取端并从子进程中关闭写入端?如果我不关闭这些末端,会有任何副作用吗?为什么我们需要关闭这些末端?

【问题讨论】:

您可以拥有任意数量的消费者,但只有一个消费者可以从管道中读取消息。如果两个孩子都尝试从管道中读取,第一个将收到消息,而另一个将被阻止。如果您希望多个收件人收到相同的消息,请查看多播和广播。您也可以单播,但您必须发送到每个连接的客户端。试试unix域套接字。选择是无穷无尽的,发挥你的想象力。 YMMV 2) 您需要关闭阅读器中的写入端,否则您将永远被卡在阅读中 - 只要有写入 fd,您不知道数据是否会在某一天到来...相反,作者最好关闭其读取端,否则可能发生的情况是,例如读取进程死亡,写入进程没有注意到(毕竟仍然存在读取 fd!)以及管道缓冲区(其中is small) 填满后续 write()s 将阻塞,因为没有人在耗尽管道。 【参考方案1】:

单个管道不是允许父级向其子级广播的自然解决方案。共享内存将提供一种更自然的方法来解决该问题。只有一条消息自然地从父级广播到子级:父级可以close 管道的写入端并导致所有子级在管道的读取端看到read 返回 0。

但是,子级可以使用单个管道将信息传递回父级。只要消息正确地包含来自子节点的源信息,父节点就可以从管道的读取端响应所有子节点的响应,而每个子节点都写入管道的写入端。

【讨论】:

以上是关于unix 管道是不是仅限于在 2 个进程之间使用?的主要内容,如果未能解决你的问题,请参考以下文章

Unix/Linux进程间通信:匿名管道有名管道 pipe()mkfifo()

查漏补缺:进程间通信(IPC):管道

进程间通信——命名管道

Unix进程之间的连接,如何获取给定用户名的全名和根目录

Unix管道的有效调试技术?

Unix进程小结进程间通信方式总结