4

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 or directoryた。

もちろん、私は許可について知っています。

次に、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..] は取得していません (環境変数が出力されます)。

それ以上の方法はありませんか?

4

2 に答える 2

4

10.6では、KERN_PROCARGS2が利用可能になります:https ://gist.github.com/770696

この方法は、ps、MacFUSEのprocfsなどから使用されます。

于 2011-01-08T08:58:08.467 に答える
4

私は実際に、私が書いている Python ライブラリに同じものを必要としていました。私の検索では、これを C コードで実装する別の Python ライブラリ ( PSI ) に出会いました。これは、プロセスをリストするための Python モジュール コードの一部であり、各プロセスの引数のリストも含まれています。実際の例については、そのソースコードをご覧ください。

darwin_process.c -関連するコードのset_exe()までスクロールします。

注: サイトは非常に遅いため、読み込み中は少し我慢する必要があります。

于 2008-10-17T00:27:08.487 に答える