Obtenir l'argv d'autres processus dans OS X en utilisant C
Question
Je veux obtenir l'argv d'un autre processus comme ps.
J'utilise Mac OS X 10.4.11 sous Intel ou PowerPC.
Tout d’abord, je lis le code ps et man kvm, puis j’écris du code 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;
}
Lorsqu'il était exécuté sur PowerPC, kvm_getargv ()
renvoyait toujours la valeur NULL. Quand couru
sur Intel, kvm_openfiles ()
a échoué avec l'erreur / dev / mem: aucun fichier de ce type
ou répertoire
.
Bien sûr, je connais la permission.
Deuxièmement, j'ai essayé 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;
}
Par fwrite, j’ai argg [0] mais argv [1 ..] ne le sont pas (variables d’environnement sont imprimées.)
Il n'y a plus moyen de le faire?
La solution
Dans 10.6, KERN_PROCARGS2 est disponible: https://gist.github.com/770696
Cette manière est utilisée depuis ps, procfs sur MacFUSE, etc.
Autres conseils
En fait, j'ai besoin de la même chose pour une bibliothèque Python que j'écris et, lors de mes recherches, je suis tombé sur une autre bibliothèque Python ( PSI ) qui implémente cela dans le code C. Cela fait partie du code de module python pour la liste des processus et inclut également la liste des arguments de chaque processus. Vous pouvez consulter le code source correspondant à cet exemple:
darwin_process.c : faites défiler jusqu'à set_exe () pour obtenir le code correspondant
Remarque: le site est vraiment lent; vous devrez donc patienter un peu pendant le chargement.