我正在尝试编写一个程序,该程序分叉并等待他的孩子完成,然后孩子对输入做一些工作,然后以与父级相同的方式分叉等等。
现在,我知道将文件描述符数组分叉副本给子级,并且我应该关闭与父级关联的描述符,但我无法弄清楚哪些是父级。我需要给我的孩子父母的pid吗?
我一直试图绕开它大半个小时,我想我有某种思维障碍,因为我无法得出结论。
TL;DR:作为一个子进程,我怎么知道哪些文件描述符属于我的父进程?
紧接在fork
之后(在任何exec
函数之前(,子进程的状态与其父进程相同(fork
的结果除外,该结果仅在子进程中为 0(。所以你知道文件描述符是什么,因为你已经编码了在父子中运行的程序。在 Linux 上,你也可以读取 /proc/self/fd/
目录, 参见 proc(5(。
您可以在fork
之后和exec
之前关闭大多数文件描述符;您可以编写类似
for (int fd=3; fd<64; fd++) (void) close(fd);
我们从 3 开始,也就是 2 之后的 STDERR_FILENO
,我们在 64 处任意停止,在 close
电话中(void)
演员阵容对读者意味着我们不在乎失败close
......当然,如果你有一些 pipe(7(-s 在父级和子级之间进行通信,你会小心避免关闭它们相关的文件描述符。
(但是,像上面这样做闭环是品味不佳和老式的(
一般来说,在程序中,你会小心地在大多数文件描述符上设置 close-on-exec 标志(例如 fcntl(2( 在 F_SETFD
操作和 FD_CLOEXEC
标志上,或者直接使用 O_CLOEXEC
打开(2(,然后 execve(2((在大多数子进程中在 fork
之后完成(会关闭它们。