質問
psのような他のプロセスのargvを取得したい。
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:No such fileで失敗しました
またはディレクトリ
。
もちろん、許可については知っています。
次に、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、MacFUSEのprocfsなどから使用されます。
他のヒント
実際に、私が書いているPythonライブラリにも同じものが必要でしたが、検索で別のPythonライブラリ( PSI )これをCコードで実装します。プロセスをリストするためのpythonモジュールコードの一部であり、各プロセスの引数もリストします。実際の例については、ソースコードをご覧ください:
darwin_process.c -関連するコードの set_exe()までスクロールします
注:サイトは本当に遅いので、読み込み中は少し我慢する必要があります。
所属していません StackOverflow