ps显示线程名称

时间:2013-07-07 18:03:42

标签: linux pthreads ps

ps(或类似工具)是否有办法显示pthread的名称? 我写了以下简单的程序:

// 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上运行我的程序。

3 个答案:

答案 0 :(得分:12)

注意man page of pthread_setname_np(),它们展示了如何获取线程的名称:

  

pthread_setname_np()在内部写入特定于线程的comm   / proc文件系统下的文件:/ proc / self / task / [tid] / comm。   pthread_getname_np()从同一位置检索它。

  

实施例

     

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

     

以下shell会话显示程序的示例运行:

     

$ ./a.out

     

创建了一个帖子。默认名称为:a.out

     

设置后的线程名称为THREADFOO。

     

^ Z #Suspend the program

     

1 +已停止./a.out

     

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

     

PID TID CMD命令

     

5990 5990 ./a.out a.out

     

5990 5991 ./a.out THREADFOO

     

$ cat / proc / 5990 / task / 5990 / comm

     

的a.out

     

$ cat / proc / 5990 / task / 5991 / comm

     

THREADFOO

答案 1 :(得分:6)

使用procps-ng(https://gitlab.com/procps-ng/procps)有输出选项-L-T,它们将打印线程名称:

$ ps -eL
$ ps -eT

-l长格式可以与它们一起使用:

$ ps -eLl
$ ps -eTl

-f选项将使用完整命令行替换线程名称,这对所有线程都是相同的。

答案 2 :(得分:5)

使用PID 12345显示进程的线程ID和名称:

ps H -o 'tid comm' 12345