문제

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을 반환했습니다. 인텔에서 달렸을 때 kvm_openfiles() 오류로 실패했습니다 /dev/mem: No such file or directory.

Cource, 나는 허가에 대해 알고 있습니다.

둘째, 나는 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 ..]는 그렇지 않다 (환경 변수는 인쇄되지 않았다.)

더 이상 할 수있는 방법이 없습니까?

도움이 되었습니까?

해결책

10.6에서 kern_procargs2를 사용할 수 있습니다. https://gist.github.com/770696

이 방법은 ps, macfuse의 Procfs 등에서 사용됩니다.

다른 팁

나는 실제로 내가 쓰고있는 파이썬 라이브러리에 대해 같은 것을 필요로했고, 내 검색에서 나는 또 다른 Python lib를 발견했다.psi)이를 C 코드에서 구현합니다. 나열 프로세스를위한 Python 모듈 코드의 일부이며 각 프로세스에 대한 인수를 나열하는 것이 포함됩니다. 작업 예제에 대한 소스 코드를 살펴볼 수 있습니다.

다윈 _process.c - 아래로 스크롤하십시오 set_exe () 관련 코드의 경우

참고 : 사이트가 있습니다 진짜 느리기 때문에로드하는 동안 약간의 인내심이 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top