簡體   English   中英

在Linux上防止多個流程實例

[英]Preventing multiple process instances on Linux

Linux平台上用於檢查其實例的進程(C ++應用程序)尚未運行的最佳方法是什么?

您可以使用文件和文件鎖來實現此目的,但是,請注意它並不完美,並且不要復制臭名昭着的Firefox錯誤,即使它尚未運行,它有時會拒絕啟動。

它的基本邏輯是:

Invariant:
    File xxxxx will exist if and only if the program is running, and the
    contents of the file will contain the PID of that program.

On startup:
    If file xxxxx exists:
        If there is a process with the PID contained in the file:
            Assume there is some instance of the program, and exit
        Else:
            Assume that the program terminated abnormally, and
            overwrite file xxxx with the PID of this program
    Else:
        Create file xxxx, and save the current PID to that file.

On termination (typically registered via atexit):
    Delete file xxxxx

除了上面的邏輯之外,您還應該使用鎖定的第二個文件來同步對PID文件的訪問(即充當互斥鎖以使其在進程級並發方面安全)。

執行此操作的標准方法是在某處創建一個pidfile,通常包含程序的pid。

你不需要把pid放在那里,你可以放一個獨家鎖。 如果你打開它進行讀/寫,並用LOCK_EX |來填充它 LOCK_NB,如果文件已被鎖定,它將失敗。 這是無競爭條件的,如果程序崩潰,鎖將自動釋放。

通常,您希望按用戶執行此操作,因此用戶的主目錄是放置文件的好地方。

如果它是守護進程,那么像/ var / run這樣的地方會更好。

邁克爾解決方案的一個相關替代方法是在已知位置(可能在/ var / run或/ tmp下)創建目錄,並使用系統調用的成功/失敗作為確保互斥的機制。 這是CVS多年來使用的相同的互斥技巧,因為目錄創建在大多數(可能是所有)商品操作系統上都是原子的。 在目錄+ PID創建過程意外死亡且無法清理的情況下,PID文件仍然有用。 另外,在檢查現有目錄+ PID是否有效時,我建議顯式檢查/proc/<PID>/exe符號鏈接以驗證它是否指向您的可執行文件,而不僅僅是假設PID尚未被回收。

對於桌面應用程序,檢查是否為當前用戶啟動實例可能更為可行,以便兩個用戶可以運行自己的實例。

您可以使用某些庫( libunique (GTK +)或QtSingleApplication (Qt)),也可以自己動手。 除了前面提到的pid-file之外,您還可以在用戶主目錄中的某個位置打開FIFO或UNIX域套接字。 這樣,您就可以與正在運行的實例進行通信,例如。 提升運行實例的窗口或告訴運行實例打開新文件/ URI /等等。

您可以使用名為信號量POSIX來執行此操作。 它比使用文件鎖更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM