【问题标题】:Allow only one running instance of a program只允许程序的一个运行实例
【发布时间】:2012-08-31 00:09:29
【问题描述】:

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

我怎样才能做到这一点?

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

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

【问题讨论】:

  • 也许您可以在第一次启动进程时锁定某个文件,而在后续启动时,如果文件已被锁定,您将拒绝启动...(请参阅flock(2)
  • 当你的守护进程崩溃时可能会产生问题?
  • Mac OS X 上fnctl 的联机帮助页显示“当进程终止时,与给定进程的文件关联的所有锁都将被删除。”,所以我想你会安全的崩溃,但您应始终注意不要造成死锁情况。
  • 查看链接:[how-to-prevent-a-linux-program-from-running-more-than-once][1] [1]:stackoverflow.com/questions/3706917/…

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


【解决方案1】:

使用计数为 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() 关闭,或者调用者退出或执行。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多