2012-09-06 99 views
4

我該如何限制我的程序只運行實例?目前我運行我的程序作爲守護進程(自動啓動和停止),當用戶單擊並嘗試再次啓動(這不是有效的用例)時,進程在用戶上下文中啓動,我想避免這種情況,原因很多。只允許一個程序正在運行的實例

我該如何做到這一點?

截至目前,我正在獲取進程列表,並在開始時進行一些檢查和退出,但此方法並不乾淨,儘管它解決了我的問題。

有人能給我一個更好的解決方案嗎? 而我使用ps來獲取進程列表,是否有任何可靠的API來完成這個任務?

+0

也許你可以鎖定首先推出的過程中的一些文件,並在後續推出,你拒絕推出,如果該文件已被鎖定......(見'羊羣(2)') – Guillaume

+0

它可能創造你的守護進程崩潰的問題? – rplusg

+0

Mac OS X上的'fnctl'的手冊頁說:「當進程終止時,與給定進程的文件關聯的所有鎖都將被刪除。」,所以我想你會在發生崩潰時安全的,但是你應該總是小心不要造成僵局。 – Guillaume

回答

2

使用計數爲1的已命名信號量。啓動時,檢查是否採用此信號量。如果是,退出。否則,拿它。

證明的概念代碼:(把附近的某處應用程序入口點)

#include <semaphore.h> 
... 
if (sem_open(<UUID string for my app>, O_CREAT, 600, 1) == SEM_FAILED) { 
    exit(0); 
} 

sem_open documentation

返回的信號描述符是提供給調用進程,直到它與sem_close關閉(),或直到調用者退出或執行。

相關問題