如果需要将打开的文件描述符导出到使用exec系列库函数创建的子进程,那么可移植选项有哪些?
谢谢.
编辑.我知道子进程继承了开放描述符.但他们如何在不知道价值的情况下使用这些描述符?我应该实现某种IPC以便将描述符传递给子进程吗?例如,如果父级创建管道,则执行的子进程如何知道管道的读/写端?
只是不要在描述符上设置O_CLOEXEC
open(2)
标志或其相应的(和标准)FD_CLOEXEC
fcntl(2)
标志 - exec*()
默认情况下它将被传递.
更新
谢谢你的澄清,这确实改变了一点点.
有几种可能性:
使用命令行参数:GnuPG的在gpg(1)
提供命令行开关--status-fd
,--logger-fd
,--attribute-fd
,--passphrase-fd
,--command-fd
为它希望接收的每个文件描述符.如果要提交或检索多种数据,这会使每个文件描述符集中在一种类型的数据上,并减少解析更复杂输出的需要.
只需处理文件并接受文件名作为参数; 当你调用程序时,传递它的文件名/dev/fd/5
,并fd
5
在调用程序之前安排输入:
cat /dev/fd/5 5</etc/passwd
Run Code Online (Sandbox Code Playgroud)遵循约定:0
将子级作为管道的读取端提供给管道1
的写入端,并使其作为普通管道"过滤器"命令工作.如果所有输入都可以合理地通过单个文件描述符发送,这绝对是最好的方法 - 并不总是令人满意.
使用环境变量来指示文件/ socket/fd:
SSH_AUTH_SOCK=/tmp/ssh-ZriaCoWL2248/agent.2248
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-CsUrnHGmKa,guid=e213e2...
Run Code Online (Sandbox Code Playgroud)
通过许多子程序传递文件信息很好.