在 C 中,child 关闭的文件描述符是否也在 parent 中关闭?

In C, are file descriptors that the child closes also closed in the parent?

据我了解,Fds 是整数,用于在内核的文件描述中查找打开的文件table。因此,如果您有这样的代码段:

int fd[2], temp1, temp2;
pipe(fd);
temp1 = fd[0];
temp2 = fd[1];
close(temp1);
close(temp2);

管道的所有文件描述符都已关闭,因此管道将不再存在。由于 FD 只是整数,所以说 close(temp1) 等同于说 close(fd[0]).

鉴于所有这些(如果我有误解,请告诉我)我对 fork() 调用后发生的事情感到困惑。由于 child 进程继承了与 parent 相同的 FD 和状态,因此 child 的 FD 应该是与 parent 相同的整数。所以按照这个逻辑,如果我在 child 中 close(fd[0]),我相信它也会阻止 parent 访问文件。由于 close() "frees" 来自文件描述符 table 的那个整数,parent 不应该有任何方式来引用该文件。

是这样吗?这似乎不太可能是实际情况,因为它会导致 parents 和 children 之间的 FD 很难使用(特别是因为你不知道哪个进程会 运行 第一的)。那么如果这个逻辑不正确,那么fork()上的FD是重复的吗?在文件描述符 table 中,parent 和 child Fds 是如何相关的,尤其是在 close() 调用之间?能够提取文件描述符 table 对我有很大帮助,所以我希望答案尽可能具体。

感谢您对此的任何帮助!

parent 和 child 有自己的文件描述符表。

如果 child 关闭(比如说)文件描述符 5,那么 parent 仍然打开文件描述符 5。

如果 child 然后打开另一个文件,它恰好得到描述符 5,那么 child 的文件描述符 5 将引用与 parent 不同的文件的文件描述符 5(不会改变)。

没有。 child 在关闭文件方面的作用仅影响 child 的文件描述符副本,而不影响 parent 的文件描述符副本。

然而,在分叉之后,两组文件描述符(在 parent 和 child 中)引用同一组打开的文件描述(注意 'descriptor' 与 'description' 术语)。如果 child 执行诸如读取或查找等影响文件描述的操作,那么 child 的活动也会影响 parent。

您需要研究 open() 的 POSIX 规范, fork() and execve()(尤其是 execve() 页面)非常小心。