我想让其他进程'argv像ps。

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

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

#include <kvm.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysctl.h>
#include <paths.h>

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。跑的时候 在Intel上, kvm_openfiles()失败,错误 / dev / mem:没有这样的文件 或目录

对于cource,我知道许可。

其次,我尝试了sysctl。

#include <sys/sysctl.h>
#include <stdio.h>
#include <stdlib.h>
#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,procfs on MacFUSE等

其他提示

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

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

注意:网站真的慢,所以在加载时你必须有点耐心。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top