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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top