macos - instalar - obtener el proceso cmdline en MAC os desde otro ejecutable basado en C
crear usb booteable mac os sierra desde windows (1)
Dependiendo de exactamente lo que quiere hacer, puede hacer algo como lo siguiente con proc_pidinfo()
(el código fuente para la implementación del kernel está aquí y el archivo de encabezado con las definiciones de estructura está aquí ):
$ cat procname.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/proc_info.h>
extern int proc_pidinfo(int pid, int flavor, uint64_t arg, user_addr_t buffer,
uint32_t buffersize);
#define SHOW_ZOMBIES 0
int main(int argc, char **argv) {
if(argc != 2) {
puts("Usage: procname <pid>");
return 1;
}
struct proc_taskallinfo info;
int ret = proc_pidinfo(atoi(argv[1]), PROC_PIDTASKALLINFO, SHOW_ZOMBIES,
(user_addr_t) &info, sizeof(struct proc_taskallinfo));
printf("ret=%d, result=%s/n", ret, (char *) info.pbsd.pbi_comm);
return 0;
}
$ clang procname.c -o procname 2>/dev/null
$ sudo ./procname 29079
ret=232, result=Google Chrome
Hubiera usado dtruss
en ps -p ... -o args
para obtener un syscall exacto que podría usar para obtener la información correcta, pero desafortunadamente en El Capitan dtruss
no parece funcionar con algunos binarios (incluyendo ps
) debido a el siguiente error:
$ sudo dtruss ps -p 29079 -o args
dtrace: failed to execute ps: dtrace cannot control executables signed with restricted entitlements
En cambio, lo que hice fue ejecutar sudo nm $(which ps)
para ver qué llamadas de biblioteca estaban ocurriendo desde ps
, luego busqué en ellas para ver qué parecían los candidatos más probables y Google para sus implementaciones en xnu (Mac OS X kernel ) código fuente.
Me gustaría averiguar si hay una llamada al sistema que obtiene el Id. De proceso remoto y devolver su línea de comando en MAC OS x (el equivalente en Linux es / proc / PID / cmdline.
podría usar la siguiente forma de leer la salida de ''px ax PID'' desde el archivo, pero creo que hay una manera más limpia.
enter code here
char sys_cmd[PATH_MAX];
snprintf(sys_cmd, PATH_MAX, "ps ax %d", pid);
fp = popen(sys_cmd, "r");
while (fgets(res, sizeof(res)-1, fp) != NULL) {
printf("%s", res);
}
pclose(fp);
Gracias