Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all
名前
pthread_setname_np, pthread_getname_np - スレッド名の設定/取得を行う
書式
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */ #include <pthread.h> int pthread_setname_np(pthread_t thread, const char *name); int pthread_getname_np(pthread_t thread, char *name, size_t len); -pthread を付けてコンパイルとリンクを行う。
説明
デフォルトでは、 pthread_create() で作成されたすべてのスレッドはプログラム名を継承する。 pthread_setname_np() 関数を使うとスレッドに固有の名前を設定することができる。 スレッド固有 の名前はマルチスレッドアプリケーションのデバッグに便利である。 スレッド名は意味のある C 言 語の文字列である。 その長さは 16 文字に限定されており、 終端のヌルバイト ('\0') も 16 文字 に含まれる。 thread 引き数で名前を変更するスレッドを指定する。 name には新しい名前を指定す る。 pthread_getname_np() 関数を使うと、 スレッド名を取得することができる。 thread 引き数は名前 を取得するスレッドを指定する。 バッファー name はスレッド名を返すのに使用される。 len には name の大きさをバイトで指定する。 name で指定されたバッファーの大きさは最低でも 16 文字と すべきである。 出力バッファーに返されたスレッド名はヌル終端される。
返り値
成功すると、これらの関数は 0 を返す。 エラーの場合、0 以外のエラー番号を返す。
エラー
pthread_setname_np() は以下のエラーで失敗する場合がある。 ERANGE name で指定された文字列の長さが、許可されている上限を超えている。 pthread_getname_np() は以下のエラーで失敗する場合がある。 ERANGE name と len で指定されたバッファーが、 スレッド名を格納するには短かすぎる。 /proc/self/task/[tid]/comm のオープンに失敗した場合、 これらの関数は open(2) で説明されて いるエラーのいずれかで失敗する。
バージョン
これらの関数は glibc バージョン 2.12 で初めて登場した。
準拠
これらの関数は非標準の GNU による拡張である。
注意
pthread_setname_np() は内部で /proc ファイルシステムのスレッド固有の comm ファイル (/proc/self/task/[tid]/comm) に書き込みを行う。 pthread_getname_np() はこのファイルから読 み出しを行う。
例
以下のプログラムは、 pthread_setname_np() と pthread_getname_np() の使用例を示している。 以下のシェルセッションは、このプログラムの実行例である。 $ ./a.out Created a thread. Default name is: a.out The thread name after setting it is THREADFOO. ^Z # Suspend the program [1]+ Stopped ./a.out $ ps H -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/task/5990/comm a.out $ cat /proc/5990/task/5991/comm THREADFOO プログラムのソース #define _GNU_SOURCE #include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <stdlib.h> #define NAMELEN 16 #define errExitEN(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); \ } while (0) static void * threadfunc(void *parm) { sleep(5); // allow main program to set the thread name return NULL; } int main(int argc, char **argv) { pthread_t thread; int rc; char thread_name[NAMELEN]; rc = pthread_create(&thread, NULL, threadfunc, NULL); if (rc != 0) errExitEN(rc, "pthread_create"); rc = pthread_getname_np(thread, thread_name, NAMELEN); if (rc != 0) errExitEN(rc, "pthread_getname_np"); printf("Created a thread. Default name is: %s\n", thread_name); rc = pthread_setname_np(thread, (argc > 1) ? argv[1] : "THREADFOO"); if (rc != 0) errExitEN(rc, "pthread_setname_np"); sleep(2); rc = pthread_getname_np(thread, thread_name, (argc > 2) ? atoi(argv[1]) : NAMELEN); if (rc != 0) errExitEN(rc, "pthread_getname_np"); printf("The thread name after setting it is %s.\n", thread_name); rc = pthread_join(thread, NULL); if (rc != 0) errExitEN(rc, "pthread_join"); printf("Done\n"); exit(EXIT_SUCCESS); }
関連項目
prctl(2), pthread_create(3), pthreads(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。