2011-04-08 89 views
2

有沒有辦法編寫一個C代碼,讓我們確定一個應用程序的前一個實例是否已經在運行?我需要用Linux和Windows的便攜方式來檢查它們,兩者都使用最新版本的GCC可用。如何確定應用程序是否已在運行? C portable Linux/Win

任何可移植代碼的例子都會有很大的幫助。我現在看到兩個選項:

  1. 檢查進程列表。這裏的linux有很好的工具,但我不認爲這些功能適用於windows。也許一些gnu庫都適合這麼做?什麼庫或功能?
  2. 保存並鎖定文件。現在,如何以兩種系統都能理解的方式做到這一點?一個問題是在哪裏保存文件?路徑樹與每個系統不同。另外,如果選擇了相對路徑,兩個應用程序仍然可以在不同目錄中使用不同的鎖定文件運行。

謝謝! Beco。

PS。 SO有不同的要求,所以如果你知道一個而不是另一個,請回答。畢竟,如果沒有可移植的「單一」方式,我仍然可以使用#ifdef和提出的代碼作爲答案。

C語言(不是C++),控制檯應用程序,GCC,Linux和Windows

回答

1

不幸的是,如果你限制自己到C,你可能會很難做到這一點。隨着C++,有升壓進程間的named_mutex,但在C,你將不得不採取:

  • UNIX系統(包括Mac OS):打開和flock文件的某處。傳統上你也會把你當前的PID寫入這個文件。注意:這可能在NFS上不安全;但無論如何,你的選擇是非常有限的。在Linux上,如果您想確保本地和安全鎖定,可以使用/dev/shm路徑。
  • Windows:打開並鎖定named mutex
1

用於窗戶,互斥效果很好。

http://msdn.microsoft.com/en-us/library/ms682411(v=vs.85).aspx

文章還提到一個互斥體的替代....

您的應用程序限制到一個實例每個用戶,創建在用戶的配置文件目錄鎖定的文件。

+0

嗨@Keith。該目錄的完整路徑是什麼?有沒有可用的變量?我編輯了這個問題,解釋了在兩個系統中嘗試這樣做時出現的一些疑問。謝謝你的時間! – 2011-04-13 06:39:17

0

C不提供內置設施來檢查應用程序是否已在運行,因此,使其跨平臺很難/不可能。但是,在Linux上,可以使用IPC。而且,在Windows上(我對這個類別不是很有經驗),你可能會發現this有幫助。

+0

對於windows,請考慮Keith的答案。我不確定它是否有效,但是,您可以嘗試。 – 2011-04-08 02:07:05

1

Unixland中的一種規範方法是讓進程將自己的PID寫入已知位置的文件中。如果這個文件存在,那麼程序可以檢查它自己的pid(通過系統調用可用)和該文件中的pid,如果不熟悉,則知道另一個進程正在運行。

相關問題