为什么使用pipe()时只有父进程和子进程之间可以通信,而不是非关联进程之间?为什么两个子进程不能使用pipe()进行通信?
有一些限制。
管道使用fd
读写数据,fd
是每个进程独立的,一个进程维护一个fd
表,当子进程fork时继承了父进程的fd
表,每个继承的fd
指向同一个由内核维护的打开文件
,也就是父进程中的相同文件。
通过同一管道通信的进程应该是相关的。
这意味着,两个进程都应该知道管道的两个fd
。
<TLPI>
说:
在存在这些进程之前,管道应该由一个共同的祖先创建。
没有这样的限制。任何两个具有获取管道各端引用方式的进程都可以进行通信。进程甚至可以使用管道与自己通信。
任何进程都可以使用以下通用的文件描述符通信方式之一来获取管道一端的引用。在这方面,管道并不特殊。
pipe()
并获取了两端的文件描述符。SCM_RIGHTS
辅助数据接收到文件描述符。/proc/<pid>/fd
的平台特定方法从另一个任意进程获得文件描述符。