gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:53:01 27 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序 fork 并等待他的 child 完成,然后 child 对输入进行一些工作,然后按照与父级相同的方式进行 fork ,依此类推。

现在,我知道 fork 会将文件描述符数组复制到子级,并且我应该关闭与父级关联的文件描述符数组,但我无法弄清楚哪些是父级。我需要向我的 child 提供其 parent 的 pid 吗?

在一个多小时的时间里,我一直在努力思考这个问题,我认为我有某种思维障碍,因为我无法得出结论。

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

最佳答案

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

您可以在fork之后和exec之前关闭大多数文件描述符;你可以编写类似的代码

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

我们从 STDERR_FILENO 之后的 3 开始,即 2,我们在 64 处任意停止,并在 上强制转换为 (void) close 调用对读者来说意味着我们不关心 close 失败......当然,如果您有例如一些pipe(7) -s 在父子之间进行通信,您将小心避免关闭其相关的文件描述符。

(但是,像上面那样做一个结束循环是低级品味和过时的)

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

关于c - 作为进程子进程,如何知道哪个文件描述符是父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33722599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com