作为一个进程child,如何知道哪个文件描述符是parents

As a process child, how to know which file descriptor is parents

我正在尝试编写一个程序,该程序分叉并等待他的 child 完成,然后 child 对输入做一些工作,然后以与 [=25= 相同的方式分叉] 等等。

现在,我知道将文件描述符数组复制到 child 并且我应该关闭与 parent 关联的那些,但我不知道哪个是parent秒。我需要给我的 child 它是 parent 的 pid 吗?

我已经花了一个多小时的时间来思考它,但我想我有某种思维障碍,因为我无法得出结论。

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

就在 fork 之后(和 任何 exec 函数之前)你的子进程与其父进程具有相同的状态(除了结果fork 的,仅在子项中为 0)。所以你知道什么是文件描述符,因为你已经在父子中编写了程序运行。在 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) 意味着reader 我们不关心失败 close... 当然,如果你有,例如一些 pipe(7)-s 用于父子之间的通信,你要小心避免关闭它们的相关文件描述符。

(但是,像上面那样做一个闭环是低俗和过时的)

一般来说,您会在程序中小心地在大多数文件描述符上设置 close-on-exec 标志(例如 fcntl(2) on F_SETFD operation and FD_CLOEXEC flag, or directly open(2) with O_CLOEXEC), then the execve(2)(在 fork 之后的大多数子进程中完成)会关闭它们。