我正在尋找一個命令列函數或 c 函數,它可以讓我知道文件是否已開啟/正在被某些東西使用。
lsof
並fuser
確實告訴了這一點,但他們提供了很多其他信息,導致在某些情況下花費長達300 毫秒(例如當我在MAC OS X 上使用此代碼時,我正在為Linux 和OS X 開發)(我有一個Windows需要 5 毫秒的解決方案,所以我試圖在 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