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]];
相关文章
相关标签/搜索