有没有更快的方法来检查文件是否正在使用?

Noi*_*art 9 command-line files

我正在寻找一个命令行函数或 c 函数,它会让我知道文件是否打开/正在被某些东西使用。

lsof并且fuser确实告诉了这一点,但是它们提供了许多其他信息,在某些情况下会导致最多 300 毫秒(例如,当我在 MAC OS X 上使用此代码时,我正在为 Linux 和 OS X 开发)(我有一个 Windows需要 5ms 的解决方案,所以我试图在 Unix 中找到一些也非常快的东西,如果文件正在使用,则只返回 true 或 false)

nix*_*gle 9

如果您正在使用这个作为一个锁,它不会因为工作没有lsoffuser防止竞争条件。

执行的基本过程lsof是遍历所有进程以/proc/*/fs查找打开的文件描述符。无论你做什么,这都需要时间。

您可以自己执行此操作,但速度不可能更快,因为您必须检查系统上的每个打开的进程。

如果您正在做的事情对时间要求严格,请想出另一种方式来做。

  • 如果您通过您编写的程序控制该文件;使用锁定文件。
  • 如果您正在运行一些对文件进行操作的命令,请查看该命令/程序提供的文档,看看它是否不能制作锁定文件。如果失败,请查看它是否无法创建包含其 PID 的文件。然后您可以查看/proc/<PID>/fs您的文件当前是否打开。只查看一个进程打开文件描述符会比映射所有进程快得多。
  • 否则,为了帮助你,我需要更多关于你在做什么的信息。

您在评论中提供了更多信息,希望确定 Firefox 是否在给定系统上运行。最好的方法是查找 Firefox 的锁定文件。它们存储在Mozilla wiki 上指定的默认位置

例如,在 linux 上,让您的程序执行以下操作:

  • 打开~/.mozilla/firefox/目录。
  • 列出所有目录,过滤以.default. (我认为所有的配置文件都以.default,结束,如果不只是爬入每个目录。)
  • 在上面的每个目录中,查找名为lock或的文件的存在.parentlock。如果您看到一个或两个文件,则 Firefox 已打开。

该算法的执行速度应该比您目前在 Windows 上执行的速度更快。

  • @Noitidart 您要解决的实际问题是什么?为了查找任何进程的打开文件描述符,您必须知道它的 PID。这对于程序的每个实例都会发生变化。“手动”获取它的一个简单方法是使用`ps aux firefox`。获取这些 PID 并在 `/proc/` 文件系统中查找它们。 (3认同)