c - 管道 - 与多个分叉的子进程通信
问题描述
我正在编写一个父进程,它需要计算一组子进程中的事件。我将使用 pipe() 来实现这一点。
我可以在父级上打开一个管道,然后派生 4 个将使用同一管道与父级通信的子进程,还是必须创建 4 个不同的管道?(每个子进程 1 个)
重要的是要声明父进程从不与子进程通信。它所做的只是:计算并总结子进程引发事件的速率。
另外:如果我可以使用共享管道,消息的原子性是什么。我是否必须将它们保留一个字节长,或者我可以假设两个 4 字节消息不会插入它们的字节?
解决方案
您可以使用单个管道。
您不需要将自己限制在单字节事件中。
man 7 pipe
在 Linux 上说:
PIPE_BUF
POSIX.1 说小于字节的write(2)
PIPE_BUF
必须是原子的:输出数据作为连续序列写入管道。超过PIPE_BUF
字节的写入可能是非原子的:内核可能将数据与其他进程写入的数据交错。POSIX.1 要求PIPE_BUF
至少为 512 字节。(在 Linux 上,PIPE_BUF
为 4096 字节。)
推荐阅读
- java - 在java web中定向时如何走出文件夹
- r - 错误:无法在 R 中加载 gfortran 编译的 DLL(“符号名不在加载表中”)
- airflow - subdag 和 schedule 是如何工作的?
- alexa - 自动填充由话语生成器工具(例如话语扩展器)生成的 Alexa 技能中的话语
- java - java.lang.IllegalStateException: getOutputStream() 已在 jsp 中为此响应调用
- java - 蛮力耗尽内存空间
- ionic-framework - 当键盘可见时,键盘隐藏页脚中的输入字段
- php - “不能使用 Intervention\Image\Facades\Image 作为图像,因为该名称已在使用中”
- php - JQuery - Ajax - 滚动和 setInterval
- javascript - Django,JavaScript:将'null'传递给前端时,JS将其转换为&39;null&39;