在C中,子项关闭的文件描述符是否也在父项中关闭?

mov*_*333 5 c fork pipe file-descriptor

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

int fd[2], temp1, temp2;
pipe(fd);
temp1 = fd[0];
temp2 = fd[1];
close(temp1);
close(temp2);
Run Code Online (Sandbox Code Playgroud)

管道的所有文件描述符都已关闭,因此管道将不再存在.由于FD只是简单的说法,说法close(temp1)与说法完全相同close(fd[0]).

鉴于这一切(如果我误解,请告诉我)我对fork()通话后发生的事情感到困惑.由于子进程继承了相同的FD和父进程的状态,因此子进程的FD应该与父进程相同.所以通过这个逻辑,如果我close(fd[0])在孩子身上,我相信它也会阻止父母访问该文件.由于close()从文件描述符表中"释放"了整数,因此父级不应该有任何方式来引用该文件.

是这样的吗?这似乎不太可能是实际情况,因为它会导致父母和孩子之间的FD很难使用(特别是因为你不知道哪个进程会先运行).那么,如果这个逻辑是不正确的,FD是否重复fork()?文件描述符表中的父和子Fds如何相关,特别是在close()调用之间?能够绘制文件描述符表对我有很大帮助,所以我希望尽可能具体地作为答案.

感谢您的帮助!

Jon*_*ler 4

不会。子进程关闭文件的方式只会影响子进程的文件描述符副本,而不会影响父进程的文件描述符副本。

但是,在分叉之后,两组文件描述符(在父级和子级中)都引用同一组打开文件描述(请注意“描述符”与“描述”术语)。如果子进程执行的操作(例如读取或查找)会影响文件描述,则子进程的活动也会影响父进程。

您需要非常仔细地研究open()fork()execve()(尤其是页面)的 POSIX 规范。execve()