如何将打开的文件描述符导出到已执行的子项

时间:2011-11-23 10:00:42

标签: c linux unix

如果需要将打开的文件描述符导出到使用exec系列库函数创建的子进程,有哪些可移植选项?

谢谢。

EDIT。我知道子进程继承了开放描述符。但他们如何在不知道价值的情况下使用这些描述符?我应该实现某种IPC以便将描述符传递给子进程吗?例如,如果父级创建管道,则执行的子进程如何知道管道的读/写端?

1 个答案:

答案 0 :(得分:6)

只是不要在描述符上设置O_CLOEXEC open(2)标志或其对应的(和标准的)FD_CLOEXEC fcntl(2)标志 - 它将通过

<强>更新

感谢您的澄清,这确实会改变一些事情。

有几种可能性:

  • 使用命令行参数:exec*()中的GnuPG提供命令行切换gpg(1)--status-fd--logger-fd--attribute-fd,{{1}对于它希望接收的每个文件描述符。如果要提交或检索多种数据,这会使每个文件描述符集中在一种类型的数据上,并减少解析更复杂输出的需要。

  • 只需处理文件并接受文件名作为参数;当你调用程序时,传递--passphrase-fd等文件名,并在调用程序之前安排输入在--command-fd /dev/fd/5上:

    fd
  • 遵循惯例:向子项提供5作为管道的读取端,cat /dev/fd/5 5</etc/passwd 到管道的写入端,并让它作为普通管道“过滤器”工作命令。如果可以通过单个文件描述符合理地发送所有输入,这绝对是最好的方法 - 并不总是可取的。

  • 使用环境变量来指示文件/ socket / fd:

    0

    很高兴通过许多子程序传递文件信息。