Gre*_*ill 5 posix fork pipe handle
背景:我有一个很大的现有进程(它恰好在 AIX 上,所以基本上是 POSIX 语义),它是更大系统的一部分。现有流程旨在连续运行。这个过程的一个新要求是处理一种新的复杂输入流。为了降低风险,我决定 fork/exec 一个子进程来进行实际的输入处理,这将现有的主进程与错误输入数据的崩溃或挂起等问题隔离开来。
子进程从标准输入读取数据,处理后写入标准输出。我已经设置了所有通信管道,因此我可以将输入数据从主进程传递给子进程,并以另一种方式读取输出,这一切正常(非阻塞以避免死锁等)。子进程与主进程从外部源接收(有限)输入流所需的时间一样长。
我的问题是关于管道手柄本身。主进程通过调用close()连接到孩子的标准输入的管道来通知孩子输入流已经完成。只要主进程持有该管道写入端的唯一句柄,这就会起作用。如果主进程由于其他不相关的原因决定分叉怎么办?这将创建管道写入端的两个句柄,这意味着当我尝试关闭 stdin 管道的写入端时,孩子不会注意到,因为还有另一个打开的写入端句柄。另一个打开的手柄不在我的控制范围内。
我知道FD_CLOEXEC我可以在文件描述符上设置一些位,以便在exec()完成后自动关闭。但是,这不会防止主进程分叉但不执行的情况。
这个问题的一般解决方案是什么?我只能想到几个想法:
很少没有 exec 就没有标准系统库fork。这很不寻常。Unix 或 Linux 中没有 close-on-fork 工具,我对 AIX 上的情况表示怀疑。如果您真的很关心的话,AIX 上有可加载的内核扩展。想必您知道fcntlfor close on exec。如果你的同事正在编写无执行程序的分支,那么我无法提供太多帮助。