PTHREAD_SETNAME_NP(3)

名前
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/ に書かれている。