web-dev-qa-db-ja.com

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

Ubuntu12.10でプログラムを実行しています。

9
Ahmed A

pthread_setname_np() のマニュアルページに注意してください。これは、スレッドの名前を取得する方法を示しています。

pthread_setname_np()は、/ procファイルシステム/ proc/self/task/[tid]/commの下にあるスレッド固有のcommファイルに内部的に書き込みます。 pthread_getname_np()は、同じ場所からそれを取得します。

そして

以下のプログラムは、pthread_setname_np()およびpthread_getname_np()の使用法を示しています。

次のシェルセッションは、プログラムの実行例を示しています。

$ ./a.out

スレッドを作成しました。デフォルト名は次のとおりです。a.out

設定後のスレッド名はTHREADFOOです。

^ Z#プログラムを一時停止します

1 +停止しました./a.out

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

PID TIDCMDコマンド

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

12
vvy

Procps-ng( https://gitlab.com/procps-ng/procps )には、スレッド名を出力する出力オプション-Lおよび-Tがあります。

$ ps -eL
$ ps -eT

-l long形式を使用できます:

$ ps -eLl
$ ps -eTl

ただし、-fオプションは、スレッド名をすべてのスレッドで同じ完全なコマンドラインに置き換えます。

6
osgx

PID12345のプロセスのスレッドIDと名前を表示します。

ps H -o 'tid comm' 12345
5
Velkan