为什么只有相关进程才能使用pipe()(IPC)进行通信?

4
为什么使用pipe()时只有父进程和子进程之间可以通信,而不是非关联进程之间?为什么两个子进程不能使用pipe()进行通信?
2个回答

4

有一些限制。

管道使用fd读写数据,fd是每个进程独立的,一个进程维护一个fd表,当子进程fork时继承了父进程的fd表,每个继承的fd指向同一个由内核维护的打开文件,也就是父进程中的相同文件。


通过同一管道通信的进程应该是相关的。

这意味着,两个进程都应该知道管道的两个fd


<TLPI>说:

在存在这些进程之前,管道应该由一个共同的祖先创建。


3

没有这样的限制。任何两个具有获取管道各端引用方式的进程都可以进行通信。进程甚至可以使用管道与自己通信。

任何进程都可以使用以下通用的文件描述符通信方式之一来获取管道一端的引用。在这方面,管道并不特殊。

  • 该进程本身调用pipe()并获取了两端的文件描述符。
  • 该进程通过套接字作为SCM_RIGHTS辅助数据接收到文件描述符。
  • 该进程使用类似于Linux上的/proc/<pid>/fd的平台特定方法从另一个任意进程获得文件描述符。
  • (可能还有其他方法。)
  • 该进程从一个祖先(直接或间接)继承了该文件描述符,该祖先使用了前述方法之一来获取它。

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