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

现在,我知道分叉将子文件描述符数组复制到子文件,并且我应该关闭与父文件关联的文件描述符,但是我不知道哪个是父文件。我需要给我的孩子父母pid吗?

在一个多小时的时间里,我一直都在努力地思考,我想我有某种思维障碍,因为我无法得出结论。

TL; DR:作为子进程,我如何知道哪个文件描述符属于我的父文件?

最佳答案

fork之后(在任何exec函数之前),子进程具有与其父进程相同的状态(fork的结果除外,该结果仅在子进程中为0)。因此,您知道什么是文件描述符,因为您已对在parent&child中运行的程序进行了编码。在Linux上,您可能还会读取/proc/self/fd/目录,请参见proc(5)

您可能在fork之后和exec之前关闭大多数文件描述符。你可以编写类似的代码

for (int fd=3; fd<64; fd++) (void) close(fd);


我们从3开始,而STDERR_FILENO在2之后,而我们在64处任意停止,并且(void)调用上对close的强制转换对读者意味着我们不关心失败的 ....当然,如果您有一些pipe(7) -s可以在父子之间进行通信,您应小心避免关闭它们的相关文件描述符。

(但是,进行上述闭合操作会降低品味和过时的风格)

通常,在程序中要谨慎设置大多数文件描述符上的close-on-exec标志(例如close操作上的fcntl(2)F_SETFD标志,或者直接使用FD_CLOEXEC设置open(2)) ,则execve(2)(在O_CLOEXEC之后的大多数子进程中完成)将关闭它们。

09-09 21:00
查看更多