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

Posted

技术标签:

【中文标题】从另一个基于 C 的可执行文件获取 MAC os 中的进程 cmdline【英文标题】:get process cmdline in MAC os from another C-based executable 【发布时间】:2015-10-08 15:36:35 【问题描述】:

我想知道是否有一个 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);

【问题讨论】:

您认为什么是“更清洁的方式”? 【参考方案1】:

根据您想要做什么,您可以使用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内核)源代码。

【讨论】:

嗯,这并没有给我命令行,它只是给了我进程的名称....有人知道如何获得实际的命令行吗?或者至少是传递给 exec 进程的参数? @horseyguy github.com/wrp/examples/blob/master/c/procname.c 获取论点。一定有更好的方法......

以上是关于从另一个基于 C 的可执行文件获取 MAC os 中的进程 cmdline的主要内容,如果未能解决你的问题,请参考以下文章

删除 Mac OS X 中 shell 可执行文件的停靠图标?

从另一个项目的可执行文件启动一个项目的可执行文件

C++ 在 Mac OS X 上编译代码并在 Linux x86 上运行

从 UI 浏览目录并选择一个文件,获取文件的位置并在 Objective C 中的 Mac OS 应用程序的字符串变量中读取它的内容

Mac OS X系统下编译运行C代码

如何在 Python 中获取当前执行文件的路径?