gpt4 book ai didi

c - 使用 C 在 OS X 中获取其他进程的 argv

转载 作者:行者123 更新时间:2023-11-30 16:59:18 24 4
gpt4 key购买 nike

我想获取其他进程的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:没有这样的文件
或目录

当然,我知道许可。

其次,我尝试了 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

这种方式在 MacFUSE 上的 ps、procfs 等中使用。

关于c - 使用 C 在 OS X 中获取其他进程的 argv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com