首页 > 解决方案 > 管道 - 与多个分叉的子进程通信

问题描述

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

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

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

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

标签: cpipeforkposix

解决方案


您可以使用单个管道。

您不需要将自己限制在单字节事件中。

man 7 pipe在 Linux 上说:

PIPE_BUF

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

(相关:POSIX 中的描述write。)


推荐阅读