Macos 从另一个基于C的可执行文件获取MAC os中的进程cmdline

Macos 从另一个基于C的可执行文件获取MAC os中的进程cmdline,macos,operating-system,system-calls,Macos,Operating System,System Calls,我想知道在MAC OS x中是否有一个sys调用获取远程进程id并返回其命令行(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, si

我想知道在MAC OS x中是否有一个sys调用获取远程进程id并返回其命令行(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()
执行以下操作(内核实现的源代码为,带有结构定义的头文件为):


相反,我所做的是运行
sudo nm$(which ps)
来查看
ps
中发生了哪些库调用,然后我查看这些库调用以查看最有可能的候选库,并在谷歌上搜索它们在xnu(Mac OS X内核)中的实现源代码。

你认为什么是“更干净的方法”?嗯,这不给我CMDLIN,它只给了我这个过程的名字……谁知道如何得到实际的CMDLIN?或者至少是传递给进程的参数?@ HORSEYGEY获取参数。必须有更好的方法……
$ 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
$ sudo dtruss ps -p 29079 -o args

dtrace: failed to execute ps: dtrace cannot control executables signed with restricted entitlements