我正在尝试编写一个程序,这个程序会分叉并等待他的孩子完成,然后孩子会对输入做一些工作,然后以与父母一样的方式进行分叉等等。
现在,我知道将子文件描述符数组复制到子文件中,并且我应该关闭与父文件关联的文件描述符,但我无法弄清楚哪些是父文件。我需要给孩子这是父母的pid吗?
我一直试图在一小时的大部分时间里把头包裹起来,我觉得我有一种心态障碍,因为我无法得出结论。
TL; DR:作为子进程,如何知道哪些文件描述符属于我的父进程?
答案 0 :(得分:2)
在fork
(以及之前的任何exec
函数)之后,您的子进程与其父进程具有相同的状态({{1的结果除外)只有在孩子中才为0)。所以你知道什么是文件描述符,因为你已经编写了在parent& child中运行的程序。在Linux上,您可能还会阅读fork
目录,请参阅proc(5)。
您可以在/proc/self/fd/
之后和fork
之前关闭大多数文件描述符;你可以编写类似
exec
我们从3开始,在for (int fd=3; fd<64; fd++) (void) close(fd);
之后是2,我们在64时任意停止,STDERR_FILENO
电话上(void)
的强制转换意味着读者我们不关心失败close
....当然,如果你有例如一些pipe(7) - 用于在父母和孩子之间进行通信,你要小心避免关闭他们的相关文件描述符。
(但是,像上面这样的结束循环是味道不佳和旧时尚)
通常,在程序中要小心,在大多数文件描述符上设置close-on-exec标志(例如close
操作F_SETFD
和FD_CLOEXEC
标志上的fcntl(2),或者直接open(2)与O_CLOEXEC
),然后execve(2)(在fork
之后的大多数子进程中完成)将关闭它们。