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でプログラムを実行しています。
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
Procps-ng( https://gitlab.com/procps-ng/procps )には、スレッド名を出力する出力オプション-L
および-T
があります。
$ ps -eL
$ ps -eT
-l
long形式を使用できます:
$ ps -eLl
$ ps -eTl
ただし、-f
オプションは、スレッド名をすべてのスレッドで同じ完全なコマンドラインに置き換えます。
PID12345のプロセスのスレッドIDと名前を表示します。
ps H -o 'tid comm' 12345