Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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 namelen で指定されたバッファーが、 スレッド名を格納するには短かすぎる。

       /proc/self/task/[tid]/comm  のオープンに失敗した場合、 これらの関数は open(2) で説明されて
       いるエラーのいずれかで失敗する。

バージョン

       これらの関数は glibc バージョン 2.12 で初めて登場した。

属性

       この節で使用されている用語の説明については、 attributes(7) を参照。

       ┌──────────────────────┬───────────────┬─────────┐
       │インターフェース属性      │
       ├──────────────────────┼───────────────┼─────────┤
       │pthread_setname_np(), │ Thread safety │ MT-Safe │
       │pthread_getname_np()  │               │         │
       └──────────────────────┴───────────────┴─────────┘

準拠

       これらの関数は非標準の  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/ に書かれている。