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

时间:2016-02-17 03:41:17

标签: c pipe fork file-descriptor

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

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应该与父进程相同。所以通过这个逻辑,如果我在孩子中close(fd[0]),我相信它也会阻止父母访问该文件。由于close()“从文件描述符表中释放”该整数,因此父级不应该有任何方式来引用该文件。

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

感谢您对此提供任何帮助!

2 个答案:

答案 0 :(得分:3)

父级和子级拥有自己的文件描述符表。

如果孩子关闭(比方说)文件描述符5,那么父母仍然打开文件描述符5.

如果孩子然后打开了另一个文件,并且碰巧得到了描述符5,那么孩子的文件描述符5将引用与父文件描述符5不同的文件(不会发生变化)。

答案 1 :(得分:3)

没有。孩子在关闭文件方面的作用只会影响子文件描述符的副本,而不会影响父文件描述符的副本。

然而,在分叉之后,两组文件描述符(在父级和子级中)都引用同一组打开的文件描述(请注意'描述符' vs'描述'术语)。如果孩子做了影响文件描述的读取或搜索等事情,那么孩子的活动也会影响父母。

您想要研究open()的POSIX规范, fork()(尤其是execve()页面)非常谨慎。