使用C在OS X中获取其他进程’argv

我想让其他进程’argv像ps一样。

我正在使用在Intel或PowerPC上运行的Mac OS X 10.4.11。

首先,我读了ps和man kvm的代码,然后我写了一些C代码。

#include  #include  #include  #include  #include  #include  int main(void) { char errbuf[1024]; kvm_t *kd = kvm_openfiles(_PATH_DEVNULL, NULL, _PATH_DEVNULL, O_RDONLY, errbuf); int num_procs; if (!kd) { fprintf(stderr, "kvm_openfiles failed : %s\n", errbuf); return 0; } struct kinfo_proc *proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &num_procs); for (int i = 0; i < num_procs; i++) { struct kinfo_proc *pproc = &proc_table[i]; char **proc_argv = kvm_getargv(kd, pproc, 0); printf("%p\n", proc_argv); } kvm_close(kd); return 0; } 

在PowerPC上运行时, kvm_getargv()始终返回NULL。 在英特尔上运行时, kvm_openfiles()失败,错误/dev/mem: No such file or directory

对于cource,我知道许可。

其次,我尝试了sysctl。

 #include  #include  #include  #define pid_of(pproc) pproc->kp_proc.p_pid int main(void) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; int buffer_size; sysctl(mib, 4, NULL, &buffer_size, NULL, 0); struct kinfo_proc *result = malloc(buffer_size); sysctl(mib, 4, result, &buffer_size, NULL, 0); int num_procs = buffer_size / sizeof(struct kinfo_proc); for (int i = 0; i < num_procs; i++) { struct kinfo_proc *pproc = result + i; int mib[3] = { CTL_KERN, KERN_PROCARGS, pid_of(pproc) }; // KERN_PROC_ARGS is not defined char *proc_argv; int argv_len; sysctl(mib, 3, NULL, &argv_len, NULL, 0); proc_argv = malloc(sizeof(char) * argv_len); sysctl(mib, 3, proc_argv, &argv_len, NULL, 0); fwrite(proc_argv, sizeof(char), argv_len, stdout); printf("\n"); free(proc_argv); } return 0; } 

通过fwrite,我得到argv [0]但是argv [1 ..]不是(环境变量被打印出来。)

有没有办法做到这一点?

在10.6中,KERN_PROCARGS2可用: https ://gist.github.com/770696

这种方式用于ps,macfs上的procfs等。

我实际上对于我正在编写的Python库需要相同的东西,在我的搜索中,我遇到了另一个在C代码中实现这一点的Python lib( PSI )。 它是列出进程的python模块代码的一部分,并包括列出每个进程的参数。 您可以查看一个工作示例的源代码:

darwin_process.c – 向下滚动到set_exe()以获取相关代码

注意:该网站非常慢,因此您在加载时必须要有点耐心。