2013-07-07 112 views
6

有沒有辦法讓ps(或類似的工具)顯示pthread的名字? 我寫了下面的程序:ps顯示線程名稱

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

} 

是否有一個命令/實用工具(如ps),我可以用它來顯示線程上面的程序,包括其名稱。

$ /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 

我在Ubuntu 12.10上運行我的程序。

回答

9

注意man page of pthread_setname_np(),已經展示瞭如何獲得線程的名字:

pthread_setname_np()內寫入線程特定通訊 文件在/ proc文件系統:的/ proc /自/任務/ [ TID] /通訊。 pthread_getname_np()從相同的位置檢索它。

下面程序演示了使用pthread_setname_np()和 pthread_getname_np()。

下面的shell會話顯示程序的運行示例:

$ ./a.out

創建的線程。默認名稱是:a.out

設置它後的線程名稱爲THREADFOO。

^Z #Suspend程序

1 +停止./a.out

$ PSħ-C a.out的-o 'PID TID CMD COMM'

PID TID CMD COMMAND

5990 5990./a.out a.out

5990 5991 ./a.out THREADFOO

$執行cat/proc/5990 /任務/ 5990/COMM

一個。出

$執行cat/proc/5990 /任務/ 5991/COMM

THREADFOO

3

隨着procps的-NG(https://gitlab.com/procps-ng/procps),有輸出選項-L-T這將打印線程的名字:

$ ps -eL 
$ ps -eT 

-l長格式可以與它們一起使用:

$ ps -eLl 
$ ps -eTl 

-f選項將用完全的命令行替換線程名稱,該命令行對所有線程都是相同的。

0

顯示與PID 12345線程ID和過程的名稱:

ps H -o 'tid comm' 12345