2012-09-05 29 views
6

Sono su OSX Mountain Lion e sto cercando di recuperare il nome di un processo usando il suo PID.Ottieni il nome da PID?

Quello che segue è il codice che sto usando:

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); 

Il codice di cui sopra è in grado di recuperare il nome correttamente, tuttavia recupera solo i primi 15 caratteri e "ignora" il resto. Nota questo non è un problema con la visualizzazione del nome, ma con recuperando esso. Il problema non è con il resto della mia applicazione poiché sto testando il codice sopra in un'applicazione standalone. Nota anche che ho provato a cambiare il PID, ma indipendentemente da quale PID provo, il codice recupera solo i primi 15 caratteri del nome. Il recupero dei percorsi funziona perfettamente.

Qualcuno ha qualche idea su quello che sto facendo male?

+0

Come ho studiato questo problema, ho trovato un po 'più stranezza. Se la lunghezza del buffer specificata è inferiore a 32 byte, nulla verrà inserito nella stringa, anche se il nome è breve (e si adatta al buffer da 31 byte) – charliehorse55

risposta

8

La funzione guarda il valore è lo struct proc_bsdshortinfo. È limitato a restituire una stringa da 16 byte o 15 caratteri leggibili quando include il terminatore null.

Da sys/param.h:

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

Da 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: Per aggirare il problema, ottenere l'ultimo componente del percorso:

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

Grazie. Per caso conosci qualche soluzione? – fdh

+0

ottenere il percorso completo e quindi tagliare la stringa fino all'ultimo componente del percorso. – charliehorse55

+0

Non c'è una soluzione più elegante? Considerando il recupero delle informazioni sul processo è una parte vitale di molti programmi, ci dovrebbe essere un'interfaccia più efficiente per il recupero di tali informazioni. – fdh