Erhalten Sie anderen Prozess argv in OS X mit C
Frage
Ich möchte anderen Prozess bekommen argv wie ps.
Ich verwende Mac OS X 10.4.11 auf Intel oder PowerPC.
Zuerst las ich Code von ps und Mann kvm, dann schrieb ich einige C-Code.
#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;
}
Wenn auf PowerPC lief, kvm_getargv()
zurück immer NULL. wenn lief
auf Intel, scheiterte kvm_openfiles()
mit Fehlern /dev/mem: No such file
or directory
.
Von cource weiß ich um Erlaubnis.
Zweitens habe ich versucht 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;
}
Mit dem fwrite, bekam ich argv [0] aber argv [1 ..] nicht (Umgebungsvariablen ausgedruckt.)
Es gibt keinen Weg, es zu tun?
Lösung
10.6, KERN_PROCARGS2 steht zur Verfügung: https://gist.github.com/770696
Auf diese Weise von ps, procfs auf MacFUSE verwendet wird, etc.
Andere Tipps
Ich habe tatsächlich worden, um die gleiche Sache für eine Python-Bibliothek Ich schreibe, und in meiner Suche stieß ich auf einem anderen Python lib ( PSI ), die diese in C-Code implementiert. Es ist Teil des Moduls Code Python für Prozesse Auflistung und umfasst für jeden Prozess als auch die Argumente auflistet. Sie könnten, dass für ein funktionierendes Beispiel einen Blick auf den Quellcode nehmen:
darwin_process.c - nach unten scrollen zu set_exe () für den entsprechenden Code
. Hinweis: die Seite ist wirklich langsam, so musst du ein bisschen geduldig sein, während es lädt