我知道如果我在open
之前调用fork()
函数,IO指针将在进程之间共享。
如果其中一个进程关闭了调用close(fd)
函数的文件,其他进程是否仍然能够写入/读取该文件,或者该文件是否会为每个人关闭?
答案 0 :(得分:7)
是。每个进程都有一个文件描述符的副本(以及其他内容)。因此,关闭它的一个过程不会影响其他过程中fd
的副本。
来自fork()
手册:
孩子继承父母的一组打开文件的副本 描述。子中的每个文件描述符都是相同的 打开文件描述(参见open(2))作为相应的文件 父级中的描述符。这意味着两个描述符 共享打开文件状态标志,当前文件偏移量和信号 - 驱动的I / O属性(参见F_SETOWN和 fcntl(2)中的F_SETSIG。
来自close()
手册:
如果fd是引用底层open的最后一个文件描述符 文件描述(参见open(2)),与之相关的资源 打开文件描述被释放;如果描述符是最后一个 引用已使用unlink(2)删除的文件 被删除。
因此,如果你执行close(fd);
,它只会关闭该进程中的引用,并且其他持有对同一文件描述符的引用的进程可以继续对其进行操作。
答案 1 :(得分:2)
每当创建子进程时,它都会从父进程获取文件描述符表的副本。并且存在与每个文件描述符相对应的引用计数,即当前正在访问该文件的进程数。因此,如果文件在主进程中打开并且创建了子进程,则引用计数递增,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会递减。当引用计数达到零时,文件最终关闭。