【发布时间】:2013-04-21 00:45:51
【问题描述】:
为什么有管道()只有父子进程可以通信的限制,为什么不相关的进程? 为什么一个进程的两个子进程不能使用 pipe() 进行通信?
【问题讨论】:
为什么有管道()只有父子进程可以通信的限制,为什么不相关的进程? 为什么一个进程的两个子进程不能使用 pipe() 进行通信?
【问题讨论】:
确实有限制。
管道使用fd读写数据,fd是per-process,一个进程维护一个fd表,child在fork时继承fd表,每个继承的fd参考与父进程相同的open file,由内核维护。
通过同一管道进行通信的进程应该是相关的。
这意味着,两个进程都应该知道管道的 2 个fd。
<TLPI> 说:
管道应该在导致进程存在的一系列
fork()调用之前由一个共同的祖先创建。
【讨论】:
没有这样的限制。任何两个能够获得对管道每一端的引用的进程都可以通信。进程甚至可以使用管道与自己通信。
任何进程都可以使用以下任何一种在进程之间传递文件描述符的通用方法来获取对管道末端之一的引用。管道在这方面并不特殊。
pipe(),并获取了两端的文件描述符。SCM_RIGHTS 辅助数据接收。/proc/<pid>/fd)从另一个任意进程获取文件描述符。【讨论】: