posix_spawn 以及父子进程之间 ipc 的非标准管道设置

posix_spawn and non-standard pipe setup for ipc between parent and child process

posix_spawn 的文件操作描述了子进程在 运行 execve(删除堆栈等)之前的设置代码。

预期的用例是从子进程到父进程的一个或多个附加管道作为单独的通道,它不会被子进程的 stderr 或 stdout 日志潜在地污染。 子进程中的用户代码应该能够使用单独的管道句柄作为与父进程的专用通信通道,即使是 exec(而且不仅仅是函数被执行)。 我们想关闭一个管道末端以防止无限读取等待输入,因此必须 dup() 它而不提供文件描述符,因为任何选择的文件描述符都可能用于父子之间的另一操作(没有 CLOEXEC 和合集)。

据我了解,这在子进程设置期间(在 execve 之前克隆之后)仅留下 2 个选项:

  1. 在子进程设置期间存储环境变量
  2. 将文件描述符添加到它自己的标准输入中,以便稍后在用户代码中parsing/using

posix_spawn 是否将操作指定为 1. 修改环境变量或 2. 在子进程设置期间应用写入操作? 如果两者的答案是否定的: 有没有一种可移植的方法来解决这个问题,即使用函数指针? 您是否看到任何有缺陷的假设或解决方法来简化解决方案?

  1. posix_spawn 将指向所需 child 环境的指针作为参数。如果你想使用 parent 的环境,你可以在这里传递 environ,但没有义务这样做。如果你想传递它的修改版本,你必须在调用 posix_spawn 之前在 parent 中构建它并传递一个指向它的指针。

  2. 无论您使用的是 posix_spawn 还是任何其他机制,都没有“将文件描述符添加到标准输入”这样的事情。 stdin 是单个文件描述符 (0),它指的是单个打开的文件描述。我不明白你到底想达到什么目的,但正常的使用模式是在 parent 中设置一个管道,然后使用 dup2 文件操作(作为参数传递给 posix_spawn)为了将该管道的读取端放在 child 的 fd 0 上。然后可以从 parent 写入写入端,或者传递给一个或多个其他进程让它们写入