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

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

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

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

答案1

如果您将其用作锁,它将无法发挥作用lsoffuser防止竞争条件。

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

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

如果您所做的事情对时间要求很高,请想出另一种方法来完成。

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

您在评论中提供了更多信息,说明您想要确定 Firefox 是否在给定系统上运行。最好的方法是查找 Firefox 的锁定文件。这些文件存储在默认位置Mozilla wiki 上有说明。

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

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

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

答案2

总结

你的一条评论,您声明:

我的具体情况是:我有一个文件的路径。如果 Firefox 正在运行,则该文件会被锁定。我想查看它是否被锁定,以判断 Firefox 是否正在运行。

您最初关于锁文件的问题似乎有点绕弯子,因为有更简单的方法可以查明 Firefox 是否正在为特定用户运行,并检查其进程状态。

检查进程状态

查找给定进程的 PID 的更合理方法是使用程序包来自进程包。例如:

$ pgrep -u $LOGNAME firefox
5671

然后你可以使用以下命令检查 PID 的状态附言

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

或者只获取州旗,不包含任何其他内容:

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

在我的系统中,上面的一行代码始终只需要 1.4 毫秒即可完成。您的时间可能会有所不同。

进程状态代码

ps(1) 的“进程状态代码”部分详细说明了各种状态标志的含义。在 Ubuntu 14.04 上,手册页显示:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group

相关内容