仅允许一个正在运行的程序实例

时间:2012-09-06 08:04:45

标签: objective-c macos osx-lion osx-mountain-lion

如何限制我的程序只运行实例?目前我正在运行我的程序作为守护程序(自动启动和停止),当用户单击并尝试再次启动时(这不是一个有效的用例),进程在用户上下文中启动,我想避免这种情况有很多原因。

我怎样才能实现这个目标?

截至目前,我正在获取进程列表并进行一些检查并在开始时退出,但这种方法并不干净,但它解决了我的问题。

有人可以给我一个更好的解决方案吗? 我正在使用ps获取进程列表,有没有可靠的API来完成这项工作?

1 个答案:

答案 0 :(得分: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()关闭,或直到调用者退出或执行。