我正在编写一个父进程,该进程需要计算一组子进程中的事件。 我将使用pipe()实现这一点。
我可以在父级上打开单个管道,然后派生4个将使用同一管道与父级进行通信的子进程,还是必须创建4个不同的管道? (每个子进程1个)
重要的是要声明父级从不与子级进程通信。它所做的就是:计算并总结子进程引发事件的速率。
也:如果我可以使用共享管道,则消息的原子性是什么。我是否必须将它们保留一个字节长,还是可以假设两个4字节消息不会对其字节进行插值?
答案 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个字节。)
答案 1 :(得分:0)
另一种选择是使用由socketpair
创建的一个数据报unix套接字对,而不是管道。在这种情况下,每个write
创建一个单独的数据报,每个read
仅返回一个数据报。这样,消息可以大于PIPE_BUF
并且仍然是原子的。
答案 2 :(得分:-2)
此示例尝试使用命名管道https://www.geeksforgeeks.org/named-pipe-fifo-example-c-program/冲洗读者,然后书面应做的工作,还应该考虑消息队列,它是进程之间进行异步通信的方式