2012-09-06 98 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关闭(),或直到调用者退出或执行。

相关问题