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

时间:2015-11-15 17:24:13

标签: c linux pipe fork file-descriptor

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

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

我一直试图在一小时的大部分时间里把头包裹起来,我觉得我有一种心态障碍,因为我无法得出结论。

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

1 个答案:

答案 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_SETFDFD_CLOEXEC标志上的fcntl(2),或者直接open(2)O_CLOEXEC),然后execve(2)(在fork之后的大多数子进程中完成)将关闭它们。