在C语言中,子进程关闭的文件描述符也会在父进程中关闭吗?

6

就我了解的情况来看,Fd是用于在内核文件描述符表中查找已打开文件的整数。因此,如果你有像这样的代码段:

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

所有与管道相关的文件描述符都被关闭,因此该管道将不再存在。由于FD只是整数,因此说“close(temp1)”等同于说“close(fd [0])”。
考虑到这一点(如果我误解了,请告诉我),我对调用fork()后发生的事情感到困惑。由于子进程继承了相同的FD和父进程的状态,子进程的FD应该与父进程的相同。因此,按照这种逻辑,如果我在子进程中关闭了fd [0],我认为它也会防止父进程访问该文件。由于close()从文件描述符表中“释放”该整数,因此父进程不应该有任何方法来引用该文件。
这是真的吗?这似乎非常不可能是实际情况,因为这会导致父子之间的FD非常难以使用(特别是因为您不知道哪个进程将首先运行)。因此,如果这种逻辑是不正确的,那么FD是否在fork()上复制?在文件描述符表中,父进程和子进程Fds之间的关系是什么,尤其是在close()调用之间?能够画出文件描述符表对我很有帮助,因此我希望得到尽可能具体的答案。
感谢您对此的任何帮助!
2个回答

4

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

但是,在fork后立即,父进程和子进程的两组文件描述符都指向相同的一组打开的文件描述符(请注意“descriptor”与“description”的术语之间的区别)。 如果子进程进行读取或查找等影响文件描述的操作,则子进程的活动也会影响父进程。

您需要仔细研究POSIX规范的open()fork()execve()(特别是execve()页)。


3
父进程和子进程有各自的文件描述符表。 如果子进程关闭了(比如)文件描述符5,那么父进程仍然保持文件描述符5处于打开状态。 如果子进程之后打开了另一个文件,并且恰好得到了描述符5,则子进程的文件描述符5将指向与父进程的文件描述符5不同的文件(父进程的文件描述符5并未更改)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接