验证程序是否仍由PID运行? GetProcessForPID失败

时间:2011-11-08 19:57:15

标签: objective-c macos cocoa

所以我基本上只是想知道外国应用程序何时启动和关闭。

现在我正在运行一个检查这个的循环:

- (BOOL)isRunning:(int)AppPid{
    ProcessSerialNumber psn = { kNoProcess, kNoProcess };
    OSStatus err = GetProcessForPID(AppPid, &psn);
    if ( err != noErr ){
        NSLog(@"Error %d", err);
        return NO;
    }
    return YES;
}

我遇到的问题是,如果我过多地调用此函数(比如说一秒钟50次),它最终会失败并说该过程没有运行,当它实际上是

这可能每10分钟发生一次,或连续发生5次,这是不可预测的。

我的问题 - 是否有另一种简单的方法可以通过Cocoa / Objective-C来确定进程是否正在运行(这不涉及调用ps的系统任务,因为这样做50次/秒不是智能)?

2 个答案:

答案 0 :(得分:3)

[NSRunningApplication runningApplicationWithProcessIdentifier:]

如果您想知道特定应用程序何时启动和退出,您可以在NSWorkspace上收听一些通知,特别是NSWorkspaceDidLaunchApplicationNotificationNSWorkspaceDidTerminateApplicationNotification

然后,您可以检查通知的NSWorkspaceApplicationKey词典的userInfo,以检索与已启动或已终止的应用程序对应的NSRunningApplication,您可以通过捆绑ID(或其他)匹配该应用程序确定它是否是您感兴趣的应用程序。

答案 1 :(得分:1)

  

我的问题 - 通过cocoa / Objective-C还有另一种简单方法   确定进程是否正在运行(不涉及系统任务)   调用ps,因为这样做50次/秒并不聪明。)

你可以使用苹果示例代码(GetBSDProcessList),缓存它,并检查它。这样,您只能获得一个进程列表的调用。