如何用纯C++限制macOS进程为单实例?
macOS 控制台应用纯C++实现单实例检测(对齐Swift逻辑)
要在纯C控制台应用中实现和你提供的Swift代码相同的单实例检测逻辑,需要通过**Objective-C**桥接Cocoa框架的NSRunningApplication和NSWorkspaceAPI,最终对外暴露纯C++接口,实现方式如下:
1. 纯C++头文件(对外接口)
创建头文件SingleInstanceChecker.h,提供纯C++调用入口:
#ifndef SingleInstanceChecker_h #define SingleInstanceChecker_h #include <stdbool.h> // 检测是否有同bundle ID的其他实例在运行 bool isAnotherInstanceRunning(); #endif /* SingleInstanceChecker_h */
2. Objective-C++实现文件(桥接Cocoa)
创建实现文件SingleInstanceChecker.mm(注意后缀是.mm,让编译器按Objective-C++处理),封装Cocoa API调用:
#include "SingleInstanceChecker.h" #include <Cocoa/Cocoa.h> bool isAnotherInstanceRunning() { // 获取当前应用实例信息 NSRunningApplication *currentApp = [NSRunningApplication currentApplication]; NSString *currentBundleID = currentApp.bundleIdentifier; pid_t currentPID = currentApp.processIdentifier; // 获取系统中所有运行的应用 NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSArray<NSRunningApplication *> *runningApps = workspace.runningApplications; // 过滤同bundle ID且不同PID的应用 for (NSRunningApplication *app in runningApps) { if ([app.bundleIdentifier isEqualToString:currentBundleID] && app.processIdentifier != currentPID) { return true; } } return false; }
3. 使用说明
- 在你的纯C++主代码中直接引入头文件并调用函数:
#include "SingleInstanceChecker.h" #include <iostream> int main() { if (isAnotherInstanceRunning()) { std::cout << "已有相同实例在运行,退出程序" << std::endl; return 1; } // 你的业务逻辑 std::cout << "单实例启动成功" << std::endl; while (true) { /* 保持运行 */ } return 0; } - 编译时需链接Cocoa框架,示例clang编译命令:
clang -o SingleInstanceDemo main.cpp SingleInstanceChecker.mm -framework Cocoa
注意事项
- 如果你的控制台应用没有配置bundle ID(默认控制台App无Info.plist),可以改用进程名或可执行文件路径作为检测标识,将代码中的
bundleIdentifier替换为localizedName或[[app.executableURL lastPathComponent] stringByDeletingPathExtension]即可。 - 上述代码逻辑与你提供的Swift代码完全对齐,确保检测行为一致。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

