【问题标题】:Why only related processes can only communicate using pipe() (IPC)?为什么只有相关进程只能使用 pipe() (IPC) 进行通信?
【发布时间】:2013-04-21 00:45:51
【问题描述】:

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

【问题讨论】:

    标签: unix ipc pipe


    【解决方案1】:

    确实有限制。

    管道使用fd读写数据,fd是per-process,一个进程维护一个fd表,child在fork时继承fd表,每个继承的fd参考与父进程相同的open file,由内核维护。


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

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


    <TLPI> 说:

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

    【讨论】:

      【解决方案2】:

      没有这样的限制。任何两个能够获得对管道每一端的引用的进程都可以通信。进程甚至可以使用管道与自己通信。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多