Reference:
如何枚舉全部進程
用NSTask執行外部命令並獲取輸出結果的方法html
本文地址:https://segmentfault.com/a/11...shell
在OS X開發中,有時候須要枚舉全部的進程以查詢某些你須要查詢的進程,好比協做進程之類,或者是瞭解某些進程的狀態。可是貌似並無直接簡單的獲取這些信息的method,因此須要使用別的方法segmentfault
這裏使用的這套應該是來自於Core Foundation的方法,幾個相關的函數以下:函數
OSErr GetNextProcess(ProcessSerialNumber *PSN); CFDictionaryRef ProcessInformationCopyDictionary( const ProcessSerialNumber *PSN, UInt32 infoToReturn);
但很棘手的是以上兩個方法在OS X 10.9以後都是「deprecated」狀態了,按照Apple一向的尿性,不知道何時升級了Xcode就不支持了……ui
首先從第二個函數中能夠得到不少信息,好比能夠直接調用一下的例子來列舉全部的process:.net
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()
出來查看unix
前一個方法只能解決查看普通進程的功能,沒法看到不少後臺進程或者是系統級進程。這個時候天然想到一些shell命令了。
在OS X中要使用NSTask
來啓動shell命令,而後重定向輸出。下午女列出讀取shell輸出到一個NSString
對象的例子,能夠直接複製粘貼使用:code
- (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]; }
調用方法以下:orm
NSString *psResult = [self runShellCommand: @"/bin/ps" arguments:[NSArray arrayWithObjects: @"-A", nil]];