objective-c - 如何检查应用程序/二进制文件的另一个实例是否已经在运行

标签 objective-c macos osx-lion osx-snow-leopard command-line-tool

我正在使用 Objective-c 在 Mac 中编写命令行应用程序

在应用程序启动时,我想检查同一应用程序的另一个实例是否已经在运行。如果是,那么我应该等待它完成或退出当前实例或退出另一个实例等。

有什么办法吗?

最佳答案

标准的 Unix 解决方案是创建一个“运行文件”。当您启动时,您尝试创建该文件并将您的 pid 写入该文件(如果它不存在);如果它确实存在,请从中读取 pid,如果有一个正在运行的程序具有该 pid 和您的进程名称,请等待/退出/随便。

问题是,你把那个文件放在哪里,你叫它什么?

首先,您必须确定“已经在运行”的确切含义。显然不是“世界上任何地方”,但它可以是从“当前机器上的任何地方”到“当前桌面 session 中”的任何地方。 (例如,如果用户 A 启动您的程序,暂停它,然后用户 B 出现并通过快速用户切换接管计算机,她是否能够运行该程序?)

对于该问题的几乎所有合理答案,都有一个明显的路径名模式。例如,在 Mac 上,/tmp 在系统范围内共享,而 $TMPDIR 特定于给定 session ,因此,例如,/tmp/${ARGV[0]}.pid 是表示“只有一个”的好方法在机器上复制,句点”,而 ${TMPDIR}/${ARGV[0]}.pid 是表示“每个 session 只有一个副本”的好方法。

关于objective-c - 如何检查应用程序/二进制文件的另一个实例是否已经在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814293/

相关文章:

objective-c - Xcode 4.2 - UILabel 自动换行

c++ - 当在创建子项后设置父项时,子项对事件是透明的

java - 无法在 netbeans 中添加 apache tomcat 服务器

c++ - 运行时opencv(QT)中的空指针

c - 使用 dup2 重定向 stdin 和 stdout 时出现未定义错误

ios - 如何在 iOS 中调整各种 iPhone 屏幕尺寸的字体大小?

ios - 如何在 quickblox iOS 中将视频文件作为附件发送?

Objective-C:NSBitmapImageRep SetColor

c++ - Clang 隐含地包含一堆不需要的 header

ruby-on-rails - 升级到 OSX 10.7 Lion 后修复 Postgresql