2008-10-16 9 views
3

ps와 같은 다른 프로세스'argv를 얻고 싶습니다.다른 프로세스 'argv를 OS X에서 C를 사용하여

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을 시도했다. 에 fwrite으로

#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; 
} 

, 나는 [1 ..] (환경 변수가 인쇄되어 .) 할 수 있습니다

그것을 더 이상 방법이 없습니다 변수는 argv [0]하지만 변수는 argv있어?

+0

? 프로세스에 디버거로 연결할 수는 있지만 보안을 파괴 할 수있는 유일한 이유입니다. – jim

+0

저는 작업 프로세스를 데이터로 취급하고 싶습니다. 보안이 중요합니다. 하지만 ps가 argv에 액세스 할 수있는 이유는 무엇입니까? 나는 또한 ps의 출력을 파싱 할 수 있지만 전체 argv를 원한다. – nonowarn

답변

4

필자는 필자가 작성한 파이썬 라이브러리에 대해 똑같은 것을 필요로하고 있으며, 검색 할 때 C 코드에서 이것을 구현하는 다른 파이썬 라이브러리 (PSI)를 발견했다. 이것은 프로세스를 나열하는 파이썬 모듈 코드의 일부이며 각 프로세스의 인수 목록도 포함합니다. 관련 코드)

참고을 set_exe (아래로 스크롤 -

darwin_process.c : 사이트가 당신 때문에 느린 정말는 '당신은 작업 예를 들어, 그 소스 코드를 살펴 수 로드하는 동안 약간의 환자가되어야합니다. 10.6에서

+0

고마워, Jay. 나는 당신의 코드를 브라우징하고 복사하는 것으로 다시 시도했다, 나는 argv를 얻었다! – nonowarn

+8

링크가 끊어졌습니다. 파일이 더 이상 존재하지 않습니다. 나는 프로젝트의 소스를 둘러 보면서 잠시 동안 시간을 ​​보냈지 만, 그들이 말하는 것은 'sysctl'을 사용하고 있다는 것입니다. 해당 코드의 현재 위치는 src/arch/darwin_process.c에 있습니다. 이 질문을 가로막는 다른 누구에게도 도움이되기를 바랍니다. – DNS

+0

코드와 관련된 링크가 '502 - 잘못된 게이트웨이'오류 인 @jay를 반환하는 것으로 보입니다. 가능하면 많은 질문에 대한 답변이이 게시물을 가리 키므로 문제를 해결하십시오. 감사. – user3078414