管道-与多个分叉的子进程进行通信

时间:2019-06-03 14:40:18

标签: c pipe fork posix

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

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

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

也:如果我可以使用共享管道,则消息的原子性是什么。我是否必须将它们保留一个字节长,还是可以假设两个4字节消息不会对其字节进行插值?

3 个答案:

答案 0 :(得分:4)

您可以使用单个管道。

您不必将自己局限于单字节事件。

man 7 pipe在Linux上表示:

  

PIPE_BUF

     

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

(相关:description of write in POSIX。)

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

此示例尝试使用命名管道https://www.geeksforgeeks.org/named-pipe-fifo-example-c-program/冲洗读者,然后书面应做的工作,还应该考虑消息队列,它是进程之间进行异步通信的方式