Reference:
本文地址:
在OS X开发中,有时候需要枚举所有的进程以查询某些你需要查询的进程,比如协作进程之类,或者是了解某些进程的状态。但是貌似并没有直接简单的获取这些信息的method,所以需要使用别的方法
GetNextProcess
这里使用的这套应该是来自于Core Foundation的方法,几个相关的函数如下:
OSErr GetNextProcess(ProcessSerialNumber *PSN);CFDictionaryRef ProcessInformationCopyDictionary( const ProcessSerialNumber *PSN, UInt32 infoToReturn);
但很棘手的是以上两个方法在OS X 10.9之后都是“deprecated”状态了,按照Apple一贯的尿性,不知道什么时候升级了Xcode就不支持了……
首先从第二个函数中可以获得很多信息,比如可以直接调用一下的例子来列举所有的process:
ProcessSerialNumbber psn = {0, kNoProcess};OSErr callStat;while(noErr == (callStat = GetNextProcess(&psn))){ NSDictionary *dict = (__bridge NSDictionary*) ProcessInformationCopyDictionary( &psn, kProcessDictionaryIncludeAllInformationMask); NSNumber *pidNumber = (NSNumber*)[dict objectForKey:@"pid"]; /* 这一步获得了pid之后就可以做很多事了 */ ......}
得到的dictionary还有很多成员,可以参照“Core Foundation Keys”,也可以在调用的时候NSLog()
出来查看
NSTask
前一个方法只能解决查看普通进程的功能,无法看到很多后台进程或者是系统级进程。这个时候自然想到一些shell命令了。
在OS X中要使用NSTask
来启动shell命令,然后重定向输出。下午女列出读取shell输出到一个NSString
对象的例子,可以直接复制粘贴使用: - (NSString*)runShellCommand:(NSString*)path arguments:(NSArray*)arguments{ NSTask *task; NSPipe *pipe; NSFileHandle *file; NSData *dataRead; task = [[NSTask alloc] init]; [task setLaunchPath: path]; [task setArguments: arguments]; pipe = [NSPipe pipe]; [task setStandardOutput: pipe]; file = [pipe fileHandlForReading]; [task launch]; [task waitUntilExit]; dataRead = [file readDataToEndOfFile]; return [[NSString alloc] initWithData: dataRead encoding: NSUTF8StringEncoding];}
调用方法如下:
NSString *psResult = [self runShellCommand: @"/bin/ps" arguments:[NSArray arrayWithObjects: @"-A", nil]];