侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

pthread_setname_np函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 32 阅读 / 915 字 / 正在检测是否收录...

pthread_setname_np函数用法详解

pthread_setname_np函数简介

  • 头文件包含
#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_setname_np函数常见使用错误

  • 链接错误
    undefined reference to `pthread_setname_np'
    解决办法:添加链接选项
-pthread
  • 编译错误
    warning: implicit declaration of function ‘pthread_setname_np’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <pthread.h>

pthread_setname_np函数详细描述

默认情况下,使用pthread_create ()创建的所有线程都继承程序名。pthread_setname_np ()函数可用于为线程设置唯一的名称,这对于调试多线程应用程序很有用。线程名是一个有意义的C语言字符串,其长度限制为16个字符,包括终止的空字节((aq\e0(aq)。thread参数指定要更改名称的线程;name指定新名称。
pthread_getname_np ()函数可用于检索线程的名称。thread参数指定要检索其名称的线程。缓冲区name用于返回线程名;len指定name 中可用的字节数。name指定的缓冲区长度应至少为16个字符。输出缓冲区中返回的线程名将以null终止。

pthread_setname_np函数返回值

如果成功,这些函数返回0;错误时,它们返回一个非零错误号。

pthread_setname_np函数错误码

pthread_setname_np ()函数可能会失败,出现以下错误:

  • ERANGE 由name指向的指定字符串的长度超过了允许的限制。

pthread_getname_np ()函数可能会失败,出现以下错误:

  • ERANGE 由name和len指定的缓冲区太小,无法容纳线程名。

如果这些函数中的任何一个未能打开/proc/self/task/[tid]/comm ,那么调用可能会失败,出现open (2)中描述的错误之一

pthread_setname_np函数其他说明

pthread_setname_np ()在内部写入/proc文件系统下的线程特定的comm文件:/proc/self/task/[tid]/comm ,pthread_getname_np ()从相同的位置检索它。

pthread_setname_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.
\fB\(haZ\fP                           # Suspend the program
[1]+  Stopped           ./a.out
.RB "$ " "ps H \-C a.out \-o \(aqpid tid cmd comm\(aq"
 PID   TID CMD                         COMMAND
5990  5990 ./a.out                     a.out
5990  5991 ./a.out                     THREADFOO
.RB "$ " "cat /proc/5990/task/5990/comm"
a.out
.RB "$ " "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) \e
                       do { errno = en; perror(msg); \e
                            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\en", 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.\en", thread_name);

   rc = pthread_join(thread, NULL);
   if (rc != 0)
       errExitEN(rc, "pthread_join");

   printf("Done\en");
   exit(EXIT_SUCCESS);
}
0

评论区