我正在尝试编写一个程序,该程序分叉并等待他的孩子完成,然后该孩子对输入进行一些工作,然后以与父级相同的方式进行分叉,依此类推。
现在,我知道分叉将子文件描述符数组复制到子文件,并且我应该关闭与父文件关联的文件描述符,但是我不知道哪个是父文件。我需要给我的孩子父母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
之后的大多数子进程中完成)将关闭它们。