【问题标题】:As a process child, how to know which file descriptor is parents作为子进程,如何知道哪个文件描述符是父进程
【发布时间】:2024-01-07 06:50:01
【问题描述】:

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

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

一个多小时以来,我一直在努力思考它,我想我有某种思维障碍,因为我无法得出结论。

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

【问题讨论】:

  • "关闭与父关联的那些,但我不知道哪个是父。" 为什么?您正在编写代码。
  • 你试过getppid()函数了吗?

标签: c linux pipe fork file-descriptor


【解决方案1】:

就在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 处任意停止,close 调用上的 (void) 的转换意味着我们不关心的读者失败close....当然,如果你有例如一些pipe(7)-s 在父子之间进行通信,你会小心避免关闭他们的相关文件描述符。

(但是,像上面那样做一个闭环是很差的品味和旧时尚)

一般来说,你会在你的程序中小心地在大多数文件描述符上设置 close-on-exec 标志(例如,fcntl(2)F_SETFD 操作和FD_CLOEXEC 标志,或直接open(2) 和@ 987654339@),然后execve(2)(在fork之后的大多数子进程中完成)将关闭它们。

【讨论】:

    最近更新 更多