我正在寻找一个命令行函数或 c 函数,它可以让我知道某个文件是否被打开/正在使用。
lsof
并fuser
确实告诉了这一点,但他们提供了很多其他信息,导致在某些情况下需要长达 300 毫秒(例如当我在 MAC OS X 上使用此代码时,我正在为 Linux 和 OS X 进行开发)(我有一个需要 5 毫秒的 Windows 解决方案,所以我试图在 Unix 中找到一些也非常快的东西,如果文件正在使用中,则返回 true 或 false)
答案1
如果您将其用作锁,它将无法发挥作用lsof
或fuser
防止竞争条件。
基本过程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