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

时间:2013-04-26 18:48:30

标签: unix ipc pipe

为什么有限制,管道()只有父和子进程可以通信,为什么不相关的进程? 为什么一个进程的两个子进程无法使用pipe()进行通信?

2 个答案:

答案 0 :(得分:2)

没有这样的限制。任何两个具有获取对管道每端的引用的方法的过程都可以进行通信。流程甚至可以使用管道与自身通信。

任何进程都可以使用以下任何一种在进程之间传递文件描述符的通用方法来获取对管道之一的引用。管道在这方面并不特别。

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

答案 1 :(得分:2)

确实存在限制。

管道使用fd来读取/写入数据,fd是每个进程,一个进程维护一个fd表,子进程在fork时继承fd表,并且每个继承的fd引用与父进程相同的open file,由内核维护。

  

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

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

<TLPI>说:

  

管道应该在导致存在进程的一系列fork()调用之前由共同的祖先创建。