如果指向的文件同时获取,Linux 上打开的文件句柄会发生什么:
我为什么要问这样的问题:我使用的是热插拔硬件(例如 USB 设备等)。可能会发生设备(以及它的/dev/file)被用户或另一个 Gremlin 重新连接的情况。
处理这个问题的最佳做法是什么?
最佳答案
如果文件被移动(在同一文件系统中)或重命名,则文件句柄保持打开状态,仍可用于读取和写入文件。
如果文件被删除,文件句柄仍然打开并且仍然可以使用(这不是某些人所期望的)。在关闭最后一个句柄之前,该文件不会真正被删除。
如果文件被新文件替换,这完全取决于如何替换。如果文件的内容被覆盖,文件句柄将仍然有效并访问新内容。如果现有文件被取消链接并创建一个具有相同名称的新文件,或者,如果使用 rename()
将新文件移动到现有文件上,则与删除相同(见上文) - 即也就是说,文件句柄将继续引用文件的原始版本。
一般来说,一旦文件打开,文件就打开了,任何改变目录结构的人都无法改变它——他们可以移动、重命名文件或将其他东西放在它的位置,它只是保持打开状态。
在 Unix 中没有删除,只有 unlink()
,这是有道理的,因为它不一定会删除文件 - 只是从目录中删除链接。
另一方面,如果底层设备消失(例如 USB 拔出),则文件句柄将不再有效,并且可能会在任何操作中产生 IO/错误。不过,您仍然必须关闭它。即使重新插入设备也是如此,因为在这种情况下保持文件打开是不明智的。
https://stackoverflow.com/questions/2028874/