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
で初めて登場した。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
pthread_setname_np(), pthread_getname_np() |
Thread safety |
MT-Safe |
これらの関数は非標準の
GNU による拡張である。
そのため、名前に
"_np" (nonportable;
移植性がない)
という接尾辞が
付いている。
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
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。