几年前,我们编写了一个需要监视多个进程的资源使用情况的应用程序.这是在Snow Leopard的时代.命令行命令ps
已经足够我们需要了所以我们得到了源代码的副本ps
并找出了它们调用的函数和原因,然后使用类似的调用用于ps
我们项目的基础,但我们的是用Objective C编写,而不是C.这不是一个ps
副本,我们只是简单地根据代码的建模ps
来获取信息的核心.从雪豹到优胜美地,这种方法很好.
进入El Capitan和无根模式.什么工作不再有效.最初我们吹掉了这个,因为我们正在研究El Capitan的beta版本,甚至ps
本身也表现出类似的行为.随着时间的推移ps
开始在El Capitan下工作,但不是我们的代码.
当我们运行我们的应用程序时,它可以提供通用信息,例如进程名称和所有进程上的pid,但是对于用户实际上并不"拥有"内存和CPU使用的任何进程,它会报告所有内容的零.它似乎正确地报告了用户自己拥有/启动的进程.
查看日志文件,横行错误的类型如下:
系统策略:拒绝(1)mach-priv-task-port
以上显示在El Capitan 10.11.2上.操作系统的早期版本表明存在task_for_pid
"不允许"或类似的问题(我现在没有方便的旧日志文件).
查看较新的ps
源代码,我发现以下.plist文件现在是开发工具包的一部分.这不是几年前的代码:
http://www.opensource.apple.com/source/adv_cmds/adv_cmds-163/ps/entitlements.plist
以下是ps
El Capitan代码的链接:
http://www.opensource.apple.com/source/adv_cmds/adv_cmds-163/ps/
我的问题非常简单,我需要做些什么来让系统允许我们task_for_pid()
再次使用,或者更好的是,从内核获取此信息而不会遇到无根模式问题的更好方法.FYI如果无根被禁用,我们当前应用程序中的所有内容都运行正常.通过该plist文件的外观,看起来他们正在签署它并允许访问该功能,但这是一个"仅限苹果"的限额吗?
FWIW我们的原始代码是使用带有旧式make文件的gcc编译的.