2013-07-07 12 views
6

C'è un modo per ps (o strumento simile) per visualizzare il nome del pthread? ho scritto il seguente programma semplice:ps nome thread di visualizzazione

// th_name.c 
#include <stdio.h> 
#include <pthread.h> 

void * f1() { 
    printf("f1 : Starting sleep\n"); 
    sleep(30); 
    printf("f1 : Done sleep\n"); 
} 

int main() { 

    pthread_t f1_thread; 
    pthread_create(&f1_thread, NULL, f1, NULL); 
    pthread_setname_np(f1_thread, "f1_thread"); 

    printf("Main : Starting sleep\n"); 
    sleep(40); 
    printf("Main : Done sleep\n"); 
    return 0; 

} 

C'è un comando/programma di utilità (come ps) che posso usare per visualizzare i thread per il programma di cui sopra, insieme con il loro nome.

$ /tmp/th_name > /dev/null & 
[3] 2055 
$ ps -eLf | egrep "th_name|UID" 
UID  PID PPID LWP C NLWP STIME TTY   TIME CMD 
aal  31088 29342 31088 0 2 10:01 pts/4 00:00:00 /tmp/th_name 
aal  31088 29342 31089 0 2 10:01 pts/4 00:00:00 /tmp/th_name 
aal  31095 29342 31095 0 1 10:01 pts/4 00:00:00 egrep th_name|UID 

Sto eseguendo il mio programma su Ubuntu 12.10.

risposta

9

nota la man page of pthread_setname_np(), che hanno mostrato come ottenere i nomi dei fili:

pthread_setname_np() scrive internamente al filo comm specifica file con filesystem/proc:/proc/self/compito/[ tid]/comm. pthread_getname_np() lo recupera dalla stessa posizione.

e

Esempio

Il programma illustra l'uso di pthread_setname_np() e pthread_getname_np().

La seguente sessione di shell mostra un esempio di esecuzione del programma:

$ ./a.out

Creato un thread. Il nome predefinito è: a.out

Il nome del thread dopo averlo impostato è THREADFOO.

^Z #Suspend programma

1 + Stopped ./a.out

$ ps H -C a.out -o 'pid tid cmd comm'

PID TID comando cmd

5990 5990 ./a.out a.out

5990 5991 ./a.out THREADFOO

$ cat/proc/5990/compito/5990/comm

a.out

$ cat/proc/5990/compito/5991/comm

THREADFOO

3

Con procps-ng (https://gitlab.com/procps-ng/procps) ci sono l'opzione di uscita -L e -T che stamperà le discussioni nomi:

$ ps -eL 
$ ps -eT 

-l lunga formato può essere utilizzato con loro:

$ ps -eLl 
$ ps -eTl 

ma -f opzione sostituirà nome filo con la linea di comando completa che è la stessa per tutte le filettature.

0

Mostra gli ID thread e nomi del processo con 12345 PID:

ps H -o 'tid comm' 12345