posix - 有没有办法自动关闭 fork() 上的某些句柄?

标签 posix fork pipe handle

背景:我有一个很大的现有进程(它恰好在 AIX 上,所以基本上是 POSIX 语义),它是更大系统的一部分。现有流程旨在连续运行。这个过程的一个新要求是处理一种新的复杂输入流。为了降低风险,我决定 fork/exec 一个子进程来进行实际的输入处理,这将现有的主进程与错误输入数据的崩溃或挂起等问题隔离开来。

子进程从标准输入读取数据,处理后写入标准输出。我已经设置了所有通信管道,因此我可以将输入数据从主进程传递给子进程,并以另一种方式读取输出,这一切正常(非阻塞以避免死锁等)。子进程与主进程从外部源接收(有限)输入流所需的时间一样长。

我的问题是关于管道 handle 本身。主进程通过调用close()通知子进程输入流已经完成。在连接到 child 标准输入的管道上。只要主进程持有该管道写入端的唯一句柄,这就会起作用。如果主进程由于其他不相关的原因决定 fork 怎么办?这将创建管道写入端的两个句柄,这意味着当我尝试关闭 stdin 管道的写入端时, child 不会注意到,因为还有另一个打开的写入端句柄。另一个打开的 handle 不在我的控制范围内。

我知道有 FD_CLOEXEC我可以在文件描述符上设置的位,以便在 exec() 时它会自动关闭已经完成了。但是,这不会防止主进程 fork 但不执行的情况。

这个问题的一般解决方案是什么?我只能想到几个想法:

  • 确保(通过检查)现有进程不会在不执行 exec 的情况下任意 fork 。这可能是可能的,但不是通用的解决方案。
  • 在启动时,fork 一个长期存在的 helper 进程,它的唯一职责是定期 fork/exec 执行实际处理的子进程。这样,助手的句柄上下文是已知的并且可以很好地控制。然而,这很烦人,因为助手需要某种方式来知道输入流已经结束,而不是关闭其标准输入。
  • 最佳答案

    很少 没有标准的系统库 fork没有执行。这很不寻常。在 Unix 或 Linux 中没有 close-on-fork 工具,我怀疑它在 AIX 上。如果您真的很在意的话,AIX 上有可加载的内核扩展。想必你知道fcntl关闭执行。如果您的同事正在编写 exec-less fork,那么我无法提供太多帮助。

    关于posix - 有没有办法自动关闭 fork() 上的某些句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507082/

    相关文章:

    c - 目标文件夹修改后的 POSIX seekdir() 和 telldir() 行为

    c - 为什么 sys/stat.h 不使用 -std=c1x 定义 ino_t?

    c - 这是在 linux 编程中并发处理文件的有效方法吗?

    c - 画出下列程序的进程树

    无法从C 中的管道中执行读取?

    c - 了解 POSIX 和 Linux/glibc sched_* 函数之间的差异

    c -/bin/sh依赖哪些POSIX系统接口(interface)?

    c - fork 如何在这个程序上工作?

    c++ - 使用 select 多路复用未命名管道和其他文件描述符

    c - posix 管道是轻量级的吗?