我有一些使用posix_spawnp(3)创建新进程的代码.我想将子元素的stdin设置为从特定的文件描述符中读取,因此在posix_spawnp()调用之前,我要设置dup2文件操作:

ret = posix_spawn_file_actions_adddup2(&file_actions, fd_for_stdin, 0);

那么我在子进程中就没有更多的用处了,所以我认为我应该关闭它.要实现这一点,将呼叫添加到posix_spawn_file_actions_addclose(3)和将呼叫添加到fcntl(2)到SET FD_CLOEXEC之间有区别吗?我的理解是,这两个代码片段(省略了错误判断)应该具有相同的结果--是正确的,还是我遗漏了什么?

posix_spawn_file_actions_adddup2(&file_actions, fd_for_stdin, STDIN_FILENO);
posix_spawn_file_actions_addclose(&file_actions, fd_for_stdin);
posix_spawnp(..., &file_actions, ...);

对比:

posix_spawn_file_actions_adddup2(&file_actions, fd_for_stdin, STDIN_FILENO);
fcntl(fd_for_stdin, F_SETFD, FD_CLOEXEC);
posix_spawnp(..., &file_actions, ...);

推荐答案

posix_spawnp()的规格是这样写的:

  1. 子进程的打开文件描述符集最初应 与为调用进程打开的设置相同.子进程 不应继承任何文件锁定,但 应保留相应的打开文件描述(见fcntl) 保持不变.

  2. 信号掩码、信号默认操作以及有效用户和 子进程的组ID应按照 Attrp引用的属性对象.

  3. 派生文件操作对象指定的文件操作应为 按照它们被添加到派生文件的顺序执行 Actions对象.

  4. 设置了FD_CLOEXEC标志的任何文件描述符(参见fcntl)应 关门了.

在对关闭动作的描述中,没有任何东西表明它与FD_CLOEXEC旗有任何不同.在这两种情况下,它们只是在生成时关闭描述符.

但是,使用posix_spawn_file_actions_addclose()可以精确地控制何时关闭描述符,因为文件操作是按照添加它们的顺序执行的,而FD_CLEXEC总是最后处理.

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

如何在C中通过转换为char * 来访问float的字节表示?

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

Zig将std.os.argv转换为C类型argv

C中出现分段错误后关闭文件

va_copy的使用是未定义的行为吗?

空指针的运行时强制转换

将fget()与strcMP()一起使用不是正确的比较

仅在给定的大小和对齐方式下正确创建全局

为什么STM32G474RE上没有启用RCC PLL

平均程序编译,但结果不好

为什么此共享库没有预期的依赖项?

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

在编写代码时,Clion比vscode有更多的问题指示器

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

如何将两个uint32_t值交织成一个uint64_t?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

分支预测和UB(未定义的行为)

如何修复数组数据与列标题未对齐的问题?