当前位置: 首页 > 面试题库 >

如果指向的文件被移动或删除,Linux上的打开文件句柄会怎样?

薛兴德
2023-03-14
问题内容

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

  • 移开->文件句柄保持有效吗?
  • 删除->这是否导致EBADF,指示无效的文件句柄?
  • 替换为新文件->文件是否处理指向该新文件的操作?
  • 替换为指向新文件的硬链接->我的文件可以“跟随”此链接吗?
  • 由指向新文件的软链接代替->我的文件句柄现在是否命中了该软链接文件?

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

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


问题答案:

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

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

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

通常,一旦打开文件,即打开文件,并且没有人更改目录结构就可以更改它-他们可以移动,重命名文件或在其位置放置其他内容,只是保持打开状态。

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

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



 类似资料:
  • 问题内容: 我正在开发一个巨大的旧版Java应用程序,其中包含许多手写内容,如今您可以让一个框架来处理。 我现在面临的问题是,我们的Solaris Server上的文件句柄用尽了。我想知道跟踪打开文件句柄的最佳方法是什么?在哪里查看,什么会导致打开的文件句柄用尽? 我不能在Solaris下调试应用程序,只能在Windows开发环境上调试。分析Windows下的打开文件句柄是否甚至合理? 问题答案:

  • 我对此真的很困惑。如果我以编程方式删除Firest集合中的所有文档,集合本身也会被删除: 但是,如果我在线使用Firebase控制台删除所有文档,我并不总是看到集合被删除!我从字面上删除了集合中的所有文档,但它仍然在控制台中。我可以立即在集合中创建另一个文档。但有时集合确实会消失......?! 我读了一些帖子,比如删除Firestore收藏中的所有文件,但没有看到任何解释这一点的内容。 因为一个

  • 问题内容: 如果您读取整个文件时,文件句柄是否一直打开直到脚本退出?有没有更简洁的方法来读取整个文件? 问题答案: 这个问题的答案在某种程度上取决于特定的Python实现。 要了解所有内容,请特别注意实际对象。在您的代码中,该对象仅在表达式中被提及一次,并且在调用返回后立即变得不可访问。 这意味着文件对象是垃圾。剩下的唯一问题是“垃圾收集器何时收集文件对象?”。 在使用引用计数器的CPython中

  • PHP警告:move_uploaded_file(adminPanel/Images/201704210824047891。JPG):未能打开流:在第19行的G:\PleskVhost\sinnonteq.com\qhawk.sinnonteq.com\adminPanel\Product.php中没有这样的文件或目录 PHP警告:move_uploaded_file():无法将第19行G:\Pl

  • 我的代码在WAMP服务器中运行良好,没有任何警告。但当我在我的服务器上上传相同的代码时,它会显示这些代码。 [函数.移动上传文件]:打开流失败:没有这样的文件或目录 我的php文件包含以下行。$ran是系统生成的随机名称。我想隐藏文件名,所以我保持随机功能。 移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  • 问题内容: 如何在Python中删除文件或文件夹? 问题答案: 删除文件。 删除一个空目录。 删除目录及其所有内容。 模块中的对象还公开了这些实例方法: 删除文件或符号链接。 删除一个空目录。