【发布时间】:2015-09-14 19:40:08
【问题描述】:
我知道如果我在fork()之前调用open函数,IO指针在进程之间是共享的。
如果这些进程之一关闭了调用close(fd) 函数的文件,其他进程是否仍然能够写入/读取该文件,或者该文件是否会为所有人关闭?
【问题讨论】:
-
是 - 文件描述符和功能被复制
标签: c unix fork file-descriptor
我知道如果我在fork()之前调用open函数,IO指针在进程之间是共享的。
如果这些进程之一关闭了调用close(fd) 函数的文件,其他进程是否仍然能够写入/读取该文件,或者该文件是否会为所有人关闭?
【问题讨论】:
标签: c unix fork file-descriptor
是的。每个进程都有一个文件描述符的副本(除其他外)。所以一个进程关闭它不会影响fd在其他进程中的副本。
来自fork()手册:
子继承父打开文件集的副本 描述符。孩子中的每个文件描述符都引用相同的 打开文件描述(见 open(2))作为对应文件 父级中的描述符。这意味着两个描述符 共享打开文件状态标志、当前文件偏移量和信号 驱动 I/O 属性(参见 F_SETOWN 和 fcntl(2)) 中的 F_SETSIG。
来自close()手册:
如果 fd 是引用底层打开的最后一个文件描述符 文件描述(参见 open(2)),与 打开文件描述被释放;如果描述符是最后一个 引用已使用 unlink(2) 删除的文件,该文件 已删除。
因此,如果您执行close(fd);,它只会关闭该进程中的引用,而持有对同一文件描述符的另一个引用的其他进程可以继续对其进行操作。
【讨论】:
每当创建子进程时,它都会从父进程获取文件描述符表的副本。并且每个文件描述符都有一个对应的引用计数,即当前访问该文件的进程数。因此,如果一个文件在主进程中打开并创建了一个子进程,则引用计数会增加,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会减少。当引用计数达到零时,文件最终被关闭。
【讨论】: