【发布时间】:2016-02-17 03:41:17
【问题描述】:
据我了解,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() 调用之间?能够绘制出文件描述符表对我有很大帮助,因此我希望答案尽可能具体。
感谢您对此的任何帮助!
【问题讨论】:
标签: c pipe fork file-descriptor