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있어?
? 프로세스에 디버거로 연결할 수는 있지만 보안을 파괴 할 수있는 유일한 이유입니다. – jim
저는 작업 프로세스를 데이터로 취급하고 싶습니다. 보안이 중요합니다. 하지만 ps가 argv에 액세스 할 수있는 이유는 무엇입니까? 나는 또한 ps의 출력을 파싱 할 수 있지만 전체 argv를 원한다. – nonowarn