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

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

现在,我知道分支复制到子文件描述符数组,我应该关闭与父文件关联的那些,但我无法弄清楚哪些是父文件。 我需要给孩子这是父母的pid吗?

我一直试图在一小时的大部分时间里绕过它,我想我有一种心灵障碍,因为我无法得出结论。

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

fork (以及任何exec函数之前 ),您的子进程具有与其父进程相同的状态(除了fork的结果,仅在子进程中为0)。 所以你知道什么是文件描述符,因为你已经编写了在父和子中运行的程序。 在Linux上你也可以阅读/proc/self/fd/目录,参见proc(5) 。

您可以在forkexec之前关闭大多数文件描述符; 你可以编写像

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

我们从3开始,这是在STDERR_FILENO之后是2,我们在64时任意停止,并且close电话上的演员(void)意味着我们不关心失败close的读者。当然,如果您有一些管道(7) -s在父母和孩子之间进行通信,您将小心避免关闭其相关的文件描述符。

(但是,像上面那样做一个闭环就是味道不好和旧时尚)

一般情况下,在程序中要小心在大多数文件描述符上设置close-on-exec标志(例如F_SETFD操作上的fcntl(2)和FD_CLOEXEC标志,或者用O_CLOEXEC直接打开(2) ),然后执行execve (2) (在fork之后的大多数子进程中完成)将关闭它们。