PTHREAD_SETNAME_NP - Linux手册页

时间:2019-08-20 18:01:05  来源:igfitidea点击:

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)。

InterfaceAttributeValue
pthread_setname_np(),pthread_getname_np()Thread safetyMT-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/