2012-09-05 22 views
6

Estoy en OSX Mountain Lion y estoy tratando de recuperar el nombre de un proceso utilizando su PID.Obtener el nombre de PID?

El siguiente es el código que estoy utilizando:

pid_t pid = 10687; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = ""; 
char nameBuffer [256] = ""; 

int sizeOfVal = sizeof(nameBuffer); 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 
proc_name(pid, nameBuffer, sizeof(nameBuffer)); 

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer); 

El código anterior es capaz de recuperar el nombre correctamente, sin embargo, sólo recupera los primeros 15 caracteres y "ignora" el resto. Tenga en cuenta que esto no es un problema con la visualización del nombre, pero con recuperando. El problema no está en el resto de mi aplicación, ya que estoy probando el código anterior en una aplicación independiente. También tenga en cuenta que traté de cambiar el PID, pero independientemente de qué PID intente, el código solo recupera los primeros 15 caracteres del nombre. La recuperación de ruta funciona perfectamente.

¿Alguien tiene alguna idea sobre lo que estoy haciendo mal?

+0

Como he investigado este tema, encontré algo más raro. Si la longitud del búfer especificado es inferior a 32 bytes, no se colocará nada en la cadena, incluso si el nombre es corto (y cabría en el búfer de 31 bytes) – charliehorse55

Respuesta

8

La función se ve en el valor es la estructura proc_bsdshortinfo. Está limitado a devolver una cadena de 16 bytes, o 15 caracteres legibles cuando se incluye el terminador nulo.

De sys/param.h:

#define MAXCOMLEN 16  /* max command name remembered */ 

De sys/proc_info.h:

struct proc_bsdshortinfo { 
     uint32_t    pbsi_pid;  /* process id */ 
     uint32_t    pbsi_ppid;  /* process parent id */ 
     uint32_t    pbsi_pgid;  /* process perp id */ 
    uint32_t    pbsi_status;  /* p_stat value, SZOMB, SRUN, etc */ 
    char     pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ 
    uint32_t    pbsi_flags;    /* 64bit; emulated etc */ 
     uid_t     pbsi_uid;  /* current uid on process */ 
     gid_t     pbsi_gid;  /* current gid on process */ 
     uid_t     pbsi_ruid;  /* current ruid on process */ 
     gid_t     pbsi_rgid;  /* current tgid on process */ 
     uid_t     pbsi_svuid;  /* current svuid on process */ 
     gid_t     pbsi_svgid;  /* current svgid on process */ 
     uint32_t    pbsi_rfu;  /* reserved for future use*/ 
}; 

EDIT: Para evitar esto, obtener el último componente de la ruta:

pid_t pid = 3051; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE]; 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 

char nameBuffer[256]; 

int position = strlen(pathBuffer); 
while(position >= 0 && pathBuffer[position] != '/') 
{ 
    position--; 
} 

strcpy(nameBuffer, pathBuffer + position + 1); 

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer); 
+0

Gracias. Por casualidad, ¿sabes algo de esto? – fdh

+0

obtener la ruta completa y luego recortar la cadena hasta el último componente de ruta. – charliehorse55

+0

¿No hay una solución más elegante? Teniendo en cuenta la recuperación de la información del proceso es una parte vital de muchos programas, debe haber una interfaz más eficiente para recuperar dicha información. – fdh

Cuestiones relacionadas