16

有没有办法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 上运行我的程序。

4

3 回答 3

17

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

$ ps -eL
$ ps -eT

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

$ ps -eLl
$ ps -eTl

但是-f选项会将线程名称替换为对所有线程都相同的完整命令行。

于 2017-06-26T02:16:06.660 回答
12

请注意pthread_setname_np() 的手册页,其中显示了如何获取线程的名称:

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

例子

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

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

$ ./a.out

创建了一个线程。默认名称是:a.out

设置后的线程名称为 THREADFOO。

^Z #暂停程序

1 + 停止 ./a.out

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

PID TID CMD 命令

5990 5990 ./a.out a.out

5990 5991 ./a.out 线程

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

a.out

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

线程

于 2013-07-08T01:25:55.557 回答
10

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

ps H -o 'tid comm' 12345
于 2017-12-21T13:54:55.367 回答