根据您想要做什么,您可以使用proc_pidinfo() 执行以下操作(内核实现的源代码是here,带有结构定义的头文件是here):
$ cat procname.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/proc_info.h>
extern int proc_pidinfo(int pid, int flavor, uint64_t arg, user_addr_t buffer,
uint32_t buffersize);
#define SHOW_ZOMBIES 0
int main(int argc, char **argv) {
if(argc != 2) {
puts("Usage: procname <pid>");
return 1;
}
struct proc_taskallinfo info;
int ret = proc_pidinfo(atoi(argv[1]), PROC_PIDTASKALLINFO, SHOW_ZOMBIES,
(user_addr_t) &info, sizeof(struct proc_taskallinfo));
printf("ret=%d, result=%s\n", ret, (char *) info.pbsd.pbi_comm);
return 0;
}
$ clang procname.c -o procname 2>/dev/null
$ sudo ./procname 29079
ret=232, result=Google Chrome
我会在ps -p ... -o args 上使用dtruss 来获得一个准确的系统调用,您可以使用它来获取正确的信息,但不幸的是,在El Capitan 上dtruss 似乎不适用于某些二进制文件(包括ps ) 因为以下错误:
$ sudo dtruss ps -p 29079 -o args
dtrace: failed to execute ps: dtrace cannot control executables signed with restricted entitlements
我所做的是运行 sudo nm $(which ps) 以查看来自 ps 的库调用发生了什么,然后我查看了那些看起来最有可能的候选者,并在谷歌上搜索了它们在 xnu 中的实现(Mac OS X内核)源代码。