linux - 如果指向的文件被移动或删除,Linux 上打开的文件句柄会发生什么

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

  • 移开 -> 文件句柄是否保持有效?
  • 已删除 -> 这是否会导致 EBADF,指示文件句柄无效?
  • 被新文件替换 -> 文件句柄是否指向这个新文件?
  • 替换为指向新文件的硬链接(hard link) -> 我的文件是否处理“跟随”此链接?
  • 替换为指向新文件的软链接(soft link) -> 我的文件句柄现在是否点击了此软链接(soft link)文件?

我为什么要问这样的问题:我使用的是热插拔硬件(例如 USB 设备等)。可能会发生设备(以及它的/dev/file)被用户或另一个 Gremlin 重新连接的情况。

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

最佳答案

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

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

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

一般来说,一旦文件打开,文件就打开了,任何改变目录结构的人都无法改变它——他们可以移动、重命名文件或将其他东西放在它的位置,它只是保持打开状态。

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


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

https://stackoverflow.com/questions/2028874/

相关文章:

python - 随机种子() : What does it do?

python - 如何删除 Python 中的前导空格?

python - 在 Alpine Linux 上安装 Pillow 时没有这样的文件或目录 "li

python - 如何在 Python 中列出目录的内容?

linux - Ubuntu - 在启动时使用 "sudo"运行命令

linux - 如何从命令行获取 nvidia 驱动程序版本?

linux - 内核栈和用户空间栈

python - 替换大于某个值的 Python NumPy 数组的所有元素

python - 如何在 Windows 上运行多个 Python 版本

linux - 如何找出文件的 MIME 类型(Content-Type)?