macos - 如何检测OS X应用程序是否已经启动

标签 macos boost resources macos-carbon launch

通常,OS X上的应用程序 bundle 包只能启动一次,但是,只要复制 bundle 包,同一应用程序就可以启动两次。检测并阻止这种可能性的最佳策略是什么?

在Windows上,可以简单地通过应用程序在启动时创建命名资源来实现此效果,如果无法创建命名资源,则退出,这表明正在运行的另一个进程已经创建了相同资源。当应用程序退出时,这些资源将以可靠的方式在Windows上释放。

研究此问题时,我看到的问题是OS X上的API保持文件系统中的状态,从而使Windows上使用的策略不可靠,即,在不正确的退出后徘徊的文件可能错误地指示应用程序已在运行。

我可以用来在OS X上实现相同效果的API是:posix,carbon和boost。

有想法吗?

最佳答案

一个底层解决方案是使用flock()。

每个实例将在启动时尝试锁定文件,如果锁定失败,则说明另一个实例已在运行。程序退出时会自动释放群,因此不必担心过时的锁定。

请注意,无论选择哪种解决方案,都需要对“多个实例”的含义做出有意识的决定。具体来说,如果多个用户同时运行您的应用程序,可以吗?

关于macos - 如何检测OS X应用程序是否已经启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684911/

相关文章:

node.js - -bash 终端中找不到可执行文件命令

c++ - 如何使用 boost locale 检查时区是否存在

c# - C# 从资源文件中获取文件字节

macos - NSOUlineView 标题单元格字体

c++ - 使用#define 和 clang 为 info.plist 创建版本号变化?

c++ - 具有普通 STL 接口(interface)的最大数组,类似于 boost::array

c++ - boost 从 binary_archive 到 polymorphic_archive 的序列化切换

c# - 如何从 System.Drawing.Bitmap 对象中提取原始图像流?

c# - 列出文件夹中的所有嵌入资源

database - iODBC 在 Mac OSX 10.6.4 下不工作