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