PTHREAD_SETNAME_NP - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
pthread_setname_np,pthread_getname_np-设置/获取线程的名称
语法
#define _GNU_SOURCE /* See 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个字符,包括终止的空字节(aq \ 0aq)。 thread参数指定要更改其名称的线程; name指定新名称。
pthread_getname_np()函数可用于检索线程的名称。 thread参数指定要检索其名称的线程。缓冲区名称用于返回线程名称; len指定名称中可用的字节数。由名称指定的缓冲区的长度至少应为16个字符。在输出缓冲区中返回的线程名称将以null终止。
返回值
成功时,这些函数返回0;否则,返回0。错误时,它们返回非零错误号。
错误说明
pthread_setname_np()函数可能因以下错误而失败:
- ERANGE
- 名称指向的指定字符串的长度超过了允许的限制。
pthread_getname_np()函数可能因以下错误而失败:
- ERANGE
- 由name和len指定的缓冲区太小,无法容纳线程名称。
如果这些函数中的任何一个未能打开/ proc / self / task / [tid] / comm,则调用可能会因open(2)中描述的错误之一而失败。
版本
这些功能首先出现在2.12版的glibc中。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
pthread_setname_np(),pthread_getname_np() | Thread safety | MT-Safe |
遵循规范
这些功能是非标准的GNU扩展。因此名称中的后缀" _np"(不可移植)。
备注
pthread_setname_np()内部写入/ proc文件系统下的特定于线程的comm文件:/ proc / self / task / [tid] / comm。 pthread_getname_np()从同一位置检索它。
示例
下面的程序演示了pthread_setname_np()和pthread_getname_np()的用法。
以下shell会话显示了该程序的示例运行:
$ ./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
Program source
#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)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。