从另一个基于 C 的可执行文件中获取 MAC os 中的进程命令行
get process cmdline in MAC os from another C-based executable
我想知道是否有系统调用获取远程进程 ID 和 return 它是 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()
执行以下操作(内核实现的源代码是 here and header file with struct definitions is 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
发生了哪些库调用,然后我查看了这些调用以查看最有可能的候选人并用 Google 搜索他们在 xnu(Mac OS X 内核)源代码中的实现。
我想知道是否有系统调用获取远程进程 ID 和 return 它是 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()
执行以下操作(内核实现的源代码是 here and header file with struct definitions is 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
发生了哪些库调用,然后我查看了这些调用以查看最有可能的候选人并用 Google 搜索他们在 xnu(Mac OS X 内核)源代码中的实现。