博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OS X 下在代码中枚举所有进程的方法
阅读量:5967 次
发布时间:2019-06-19

本文共 1911 字,大约阅读时间需要 6 分钟。

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]];

转载地址:http://gtqax.baihongyu.com/

你可能感兴趣的文章
【386天】跃迁之路——程序员高效学习方法论探索系列(实验阶段143-2018.02.26)...
查看>>
Java数据类型分类
查看>>
springboot应用启动原理(一) 将启动脚本嵌入jar
查看>>
SpringMVC架构
查看>>
JAVA团队开发手册 - 2.代码管理
查看>>
超详细步骤 | 如何用小程序 SDK 实现电商评价模
查看>>
Android 类库
查看>>
vue和iview应用中的一些问题(持续更新)
查看>>
基于 Workman 实现Web扫描登录
查看>>
karma如何与测试框架合作2之webpack
查看>>
关于VSCode更新对于emmet2.0支持的配置更改问题。
查看>>
二叉树的遍历
查看>>
三元组相加获得target
查看>>
10分钟搭建MySQL Binlog分析+可视化方案
查看>>
vmware虚拟机配置串口
查看>>
小型自动化运维--expect脚本之传递函数
查看>>
Exchange Server 2010部署安装之一
查看>>
Nsrp实现juniper防火墙的高可用性【HA】!
查看>>
Android 动态移动控件实现
查看>>
oracle11g 安装在rhel5.0笔记
查看>>