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

pic*_*c11 1 c unix linux

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

谢谢.

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

sar*_*old 6

只是不要在描述符上设置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)

    通过许多子程序传递文件信息很好.