#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_getname_np() 関数を使うと、 スレッド名を取得することができる。 thread 引数は名前を取得するスレッドを指定する。 バッファー name はスレッド名を返すのに使用される。 len には name の大きさをバイトで指定する。 name で指定されたバッファーの大きさは最低でも 16 文字とすべきである。 出力バッファーに返されたスレッド名はヌル終端される。
pthread_getname_np() は以下のエラーで失敗する場合がある。
/proc/self/task/[tid]/comm のオープンに失敗した場合、 これらの関数は open(2) で説明されているエラーのいずれかで失敗する。
インターフェース | 属性 | 値 |
pthread_setname_np(), pthread_getname_np() | Thread safety | MT-Safe |
以下のシェルセッションは、このプログラムの実行例である。
$ ./a.out
Created a thread. Default name is: a.out
The thread name after setting it is THREADFOO.
haZ # 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 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);
}