从另一个基于c的可执行文件中获取MAC操作系统中的进程命令行



我想知道是否有一个sys调用获得远程进程id并在Mac OS X中返回它的命令行(linux中的等效是/proc/pid/cmdline)。

我可以使用下面的方法从文件中读取'px ax PID'的输出,但我相信有一个更干净的方法。

enter code here
char sys_cmd[PATH_MAX];
snprintf(sys_cmd, PATH_MAX, "ps ax %d", pid);
fp = popen(sys_cmd, "r");
while (fgets(res, sizeof(res)-1, fp) != NULL) {
    printf("%s", res);
}
pclose(fp);

根据您想要做的事情,您可以对proc_pidinfo()做以下事情(内核实现的源代码在这里,带结构体定义的头文件在这里):

$ 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=%sn", 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内核)源代码中的实现。

正确的API是KERN_PROCARGS2 sysctl,但是很难正确使用(我已经检查了这个API在公共代码中的每次使用,它们都是错误的),所以我写了一个库来包装它的使用:https://getargv.narzt.cam

最新更新