据我所知,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()
调用之间?能够绘制文件描述符表对我有很大帮助,所以我希望尽可能具体地作为答案。
感谢您对此提供任何帮助!
答案 0 :(得分:3)
父级和子级拥有自己的文件描述符表。
如果孩子关闭(比方说)文件描述符5,那么父母仍然打开文件描述符5.
如果孩子然后打开了另一个文件,并且碰巧得到了描述符5,那么孩子的文件描述符5将引用与父文件描述符5不同的文件(不会发生变化)。
答案 1 :(得分:3)