OS X 下在代碼中枚舉全部進程的方法

Reference:
如何枚舉全部進程
用NSTask執行外部命令並獲取輸出結果的方法html

本文地址:https://segmentfault.com/a/11...shell


在OS X開發中,有時候須要枚舉全部的進程以查詢某些你須要查詢的進程,好比協做進程之類,或者是瞭解某些進程的狀態。可是貌似並無直接簡單的獲取這些信息的method,因此須要使用別的方法segmentfault


GetNextProcess

這裏使用的這套應該是來自於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


NSTask

前一個方法只能解決查看普通進程的功能,沒法看到不少後臺進程或者是系統級進程。這個時候天然想到一些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]];
相關文章
相關標籤/搜索