如果需要将打开的文件描述符导出到使用exec系列库函数创建的子进程,有哪些可移植选项?
谢谢。
EDIT。我知道子进程继承了开放描述符。但他们如何在不知道价值的情况下使用这些描述符?我应该实现某种IPC以便将描述符传递给子进程吗?例如,如果父级创建管道,则执行的子进程如何知道管道的读/写端?
答案 0 :(得分:6)
只是不要在描述符上设置O_CLOEXEC
open(2)
标志或其对应的(和标准的)FD_CLOEXEC
fcntl(2)
标志 - 它将通过1}}默认情况下。
<强>更新强>
感谢您的澄清,这确实会改变一些事情。
有几种可能性:
使用命令行参数: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
很高兴通过许多子程序传递文件信息。