【问题标题】:Pipe - communicating with multiple forked child processes管道 - 与多个分叉的子进程通信
【发布时间】:2019-06-03 14:40:18
【问题描述】:

我正在编写一个父进程,它需要计算一组子进程中的事件。 我将使用 pipe() 来实现这一点。

我可以在父级上打开一个管道,然后派生 4 个子进程,这些子进程将使用同一管道与父级通信,还是必须创建 4 个不同的管道? (每个子进程1个)

声明父进程从不与子进程通信是很重要的。它所做的只是:计算并总结子进程引发事件的速率。

另外:如果我可以使用共享管道,那么消息的原子性是什么。我是否必须将它们保留一个字节长,或者我可以假设两个 4 字节的消息不会插入它们的字节?

【问题讨论】:

标签: c pipe fork posix


【解决方案1】:

您可以使用单个管道。

您无需将自己局限于单字节事件。

man 7 pipe 在 Linux 状态:

PIPE_BUF

POSIX.1 说必须小于 PIPE_BUF 字节的 write(2)s atomic:输出数据以连续的形式写入管道 顺序。超过PIPE_BUF 字节的写入可能是非原子的: 内核可以将数据与其他进程写入的数据交错。 POSIX.1 要求 PIPE_BUF 至少为 512 字节。 (在 Linux 上, PIPE_BUF 是 4096 字节。)

(相关:description of write in POSIX.)

【讨论】:

  • 我很难找到该引用关于写入管道的原子性声明的基础,并且它似乎与 Linux 手册中write() 的一些评论不一致,这似乎说在接收到信号的情况下可能发生部分写入。你知道那个文档引用的是什么吗?
  • @JohnBollinger 答案中给出的开放组链接状态为Write requests of {PIPE_BUF} bytes or less shall not be interleaved with data from other processes doing writes on the same pipe.
  • @WilliamPursell,这是来自pipe() 的 Linux 手册页的引用。我在 POSIX 中询问其声明的基础,我(仍然)无法找到。
  • 不,“在 POSIX 中写入的描述”链接到 pubs.opengroup.org/onlinepubs/9699919799/functions/write.html
【解决方案2】:

另一种选择是使用一个由socketpair 创建的数据报unix 套接字对而不是管道。在这种情况下,每个write 创建一个单独的数据报,每个read 只返回一个数据报。这样消息可以比PIPE_BUF 大,并且仍然是原子的。

【讨论】:

  • 你知道数据报性能与管道相比如何吗?会有显着差异吗?
【解决方案3】:

尝试使用命名管道是这个例子https://www.geeksforgeeks.org/named-pipe-fifo-example-c-program/阅读器然后写的应该做的工作,你还应该考虑消息队列,这是进程之间的异步通信方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多