如果指向的文件被移动,那么Linux上的打开文件句柄会发生什么

Mau*_*aus 96 linux file-io file linux-kernel systems-programming

如果指向文件同时获得Linux上的打开文件句柄会发生什么:

  • 搬走了 - >文件句柄是否保持有效?
  • 已删除 - >这是否会导致EBADF,表明文件句柄无效?
  • 替换为新文件 - >文件句柄是否指向此新文件?
  • 替换为新文件的硬链接 - >我的文件是否处理"关注"此链接?
  • 替换为新文件的软链接 - >我的文件句柄现在是否触及此软链接文件?

为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.

处理这个问题的最佳做法是什么?

Mar*_*rkR 141

如果文件被移动(在相同的文件系统中)或重命名,则文件句柄保持打开状态,仍可用于读取和写入文件.

如果文件被删除,文件句柄仍然是打开的,仍然可以使用(这不是一些人所期望的).在最后一个句柄关闭之前,不会真正删除该文件.

如果文件被新文件替换,则具体取决于文件.如果文件的内容被覆盖,文件句柄仍然有效并访问新内容.如果现有文件是未链接的,并且使用相同的名称创建了新文件,或者如果使用新文件移动到现有文件上rename(),则与删除相同(参见上文) - 也就是说,文件句柄将继续引用该文件的原始版本.

通常,一旦文件打开,文件就会打开,没有人改变目录结构可以改变它 - 它们可以移动,重命名文件,或者在其位置放置其他东西,它只是保持打开状态.

在Unix中,没有删除,unlink()这是有意义的,因为它不一定删除文件 - 只是从目录中删除链接.


另一方面,如果底层设备消失(例如USB拔出),则文件句柄将不再有效,并且可能在任何操作上给出IO /错误.你仍然需要关闭它.即使设备已重新插入,情况仍然如此,因为在这种情况下保持文件打开是不明智的.

  • 我对一件事感兴趣:如果您使用 cp 命令覆盖文件,是第一种情况还是第二种情况? (2认同)

Ana*_*tts 8

文件句柄指向inode而不是路径,因此大多数场景仍然可以正常工作,因为句柄仍然指向文件.

具体来说,使用删除方案 - 由于某种原因,该函数被称为"取消链接",它会破坏文件名(dentry)和文件之间的"链接".当您打开文件,然后取消链接时,文件实际上仍然存在,直到其引用计数变为零,即关闭句柄时.

编辑:对于硬件,您已打开特定设备节点的句柄,如果拔出设备,内核将无法访问所有设备,即使设备返回也是如此.您必须关闭设备并重新打开它.


Car*_*icz 5

我不确定其他操作,但至于删除:在文件的最后一个打开句柄关闭之前,删除不会发生(物理上,即在文件系统中)。因此,从您的应用程序下删除文件应该是不可能的。

一些应用程序(没有想到)依赖于这种行为,通过创建、打开和立即删除文件,然后这些文件与应用程序一样长 - 允许其他应用程序知道第一个应用程序的生命周期而无需查看流程图等。

类似的考虑可能适用于其他东西。