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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top