C语言 作为进程子项,如何知道哪个文件描述符是父项



我正在尝试编写一个程序,该程序分叉并等待他的孩子完成,然后孩子对输入做一些工作,然后以与父级相同的方式分叉等等。

现在,我知道将文件描述符数组分叉副本给子级,并且我应该关闭与父级关联的描述符,但我无法弄清楚哪些是父级。我需要给我的孩子父母的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 之后完成(会关闭它们。

相关内容

  • 没有找到相关文章

最新更新