objective-c – 仅允许一个正在运行的程序实例

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

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

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

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

最佳答案 使用计数为1的命名信号量.在启动时,检查是否采用了此信号量.如果是,退出.否则,接受它.

概念证明代码:(放在应用程序入口点附近)

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

sem_open documentation,

The returned semaphore descriptor is available to the calling process until it is closed with sem_close(), or until the caller exits or execs.

点赞