有沒有更快的方法來檢查文件是否正在使用?

有沒有更快的方法來檢查文件是否正在使用?

我正在尋找一個命令列函數或 c 函數,它可以讓我知道文件是否已開啟/正在被某些東西使用。

lsoffuser確實告訴了這一點,但他們提供了很多其他信息,導致在某些情況下花費長達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

相關內容