【问题标题】:In C, are file descriptors that the child closes also closed in the parent?在 C 中,子级关闭的文件描述符是否也在父级中关闭?
【发布时间】: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


    【解决方案1】:

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

    但是,在分叉之后,两组文件描述符(在父项和子项中)都引用同一组打开文件描述(注意“描述符”与“描述”术语)。如果孩子做了影响文件描述的阅读或搜索等事情,那么孩子的活动也会影响父母。

    您需要研究open() 的 POSIX 规范, fork()execve()(尤其是 execve() 页面)非常小心。

    【讨论】:

      【解决方案2】:

      父母和孩子有自己的文件描述符表。

      如果子进程关闭(比如说)文件描述符 5,那么父进程仍然打开文件描述符 5。

      如果孩子随后打开另一个文件,并且碰巧获得了描述符 5,那么孩子的文件描述符 5 将引用与父文件描述符 5 不同的文件(不会更改)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-29
        • 2017-09-05
        • 2012-09-02
        • 2014-03-28
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多