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