我有一些使用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, ...);