validar usar son sirve significa que por parametros para los linea como comandos argumentos c osx argv

usar - Obtenga otro proceso ''argv en OS X usando C



que son los argumentos en c++ (2)

En 10.6, KERN_PROCARGS2 está disponible: https://gist.github.com/770696

Esta forma se usa desde ps, procfs en MacFUSE, etc.

Quiero obtener otro proceso ''argv como ps.

Estoy usando Mac OS X 10.4.11 corriendo en Intel o PowerPC.

Primero, leí el código de ps y man kvm, luego escribí un código 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; }

Cuando se ejecutaba en PowerPC, kvm_getargv() siempre devolvía NULL. Cuando se ejecutó en Intel, kvm_openfiles() falló con el error /dev/mem: No such file or directory kvm_openfiles() /dev/mem: No such file or directory .

De fuente, sé sobre el permiso.

En segundo lugar, probé 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; }

Por fwrite, obtuve argv [0] pero argv [1 ..] no (las variables de entorno están impresas).

No hay más forma de hacerlo?


De hecho, he estado necesitando lo mismo para una biblioteca de Python que estoy escribiendo, y en mi búsqueda encontré otra lib de Python ( PSI ) que implementa esto en código C. Es parte del código del módulo de Python para los procesos de listado e incluye una lista de los argumentos para cada proceso también. Puede echar un vistazo al código fuente para obtener un ejemplo de trabajo:

darwin_process.c - desplácese hacia abajo a set_exe () para el código correspondiente

Nota: el sitio es muy lento, así que tendrás que ser un poco paciente mientras se carga.