文档章节

Linux-c给线程取名字

o
 osc_x4h57ch8
发布于 2018/04/24 15:32
字数 735
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

https://blog.csdn.net/jasonchen_gbd/article/details/51308638

 1 #define wtm_set_thread_name(n) ({ \
 2     char tname[THREAD_NAME_LEN + 1] = ""; \
 3     if (strlen(n) > THREAD_NAME_LEN) \
 4         log_debug("wtm_util_misc", "Thread name is too long, truncating it..."); \
 5     strlcpy(tname, n, THREAD_NAME_LEN); \
 6     int ret = 0; \
 7     if ((ret = prctl(PR_SET_NAME, tname, 0, 0, 0)) < 0) \
 8         log_debug("wtm_util_misc", "Error setting thread name \"%s\": %s", tname, strerror(errno)); \
 9     ret; \
10 })

已上为自己的代码,下面为转载内容。

 

为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字。这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程,对调试程序有一定帮助。

prctl是个系统调用,可以用来读取和更改一个线程的属性。其用户态接口定义如下:

1 #include <sys/prctl.h>
2 
3 int prctl(int option, unsigned long arg2, unsigned long arg3,
4    unsigned long arg4, unsigned long arg5);

 

第一个参数option用来告诉prctl要对当前线程做什么操作,针对不同的操作,后面需要的参数个数也不同。其中用来获取和修改当前线程名字的option是下面两个:


PR_SET_NAME:设置当前线程的名字
PR_GET_NAME:获得当前线程的名字

这两个option都只需要一个参数,即用来存储线程名的字符串。

 1 int prctl(int option, unsigned long arg2); 

对于arg2有如下要求:
PR_SET_NAME:arg2存放将要设置的线程名的字符指针,即(char *)arg2。名字的长度最大为15字节,且应该以'\0'结尾。如果传入的字符串长度大于15字节,则字符串将被截断。
PR_GET_NAME:arg2需要是一个已经分配空间的字符指针,且长度不小于16。prctl成功返回后,arg2被赋值为当前线程名,以'\0'结尾。
例如设置线程名:

1 char tname[16];  
2 memset(tname, 0, 16);  
3 snprintf(tname, 16, "playctrl%u", playId);  
4 prctl(PR_SET_NAME, tname);

 

获取线程名:

 1 char tname[16]; 2 prctl(PR_GET_NAME, tname); 

 

prctl()执行成功返回0,失败返回-1,并设置errno。

注:prctl()只能设置/获取当前线程的名字,在glibc 2.12之后的版本中提供了两个扩展的接口pthread_setname_np()和pthread_getname_np(),可以在进程中设置和读取其他线程的名字。

线程名在内核中由struct task_struct结构的comm成员保存,prctl()系统调用操作线程名也是通过操作这个成员实现的。

1 #define  TASK_COMM_LEN 16  
2   
3 struct task_struct {  
4  ...  
5  char comm[TASK_COMM_LEN];  
6  ...  
7 };

 

从内核的task_struct结构定义以及prctl系统调用的实现也可以看出,线程名最多15个字符。

 

在/proc/PID/task/目录下,列出了进程中的所有活动的线程,每个线程默认的名字和进程名相同,都是cmdline,通过prctl设置线程名后便可很方便的找到线程名和tid的对应关系,如果存在/proc/PID/task/tid/comm文件,里面就存放着线程名

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

linux下java环境搭建

1、jdk下载: 官方地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 如下图所示,我这边选择的是红框中的版本 2、压缩包上传至服务器 将下载的压缩包上传...

wc_飞豆
43分钟前
17
0
面试题:Java对象不再使用时,为什么要赋值为null?

前言 许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回...

码农突围
46分钟前
22
0
设计模式(5) 原型模式

原型模式 原型模式的适用场景 浅拷贝 深拷贝 用Initialize方法修改初始化状态 原型模式与之前学习的各种工厂方法、单例模式、建造者模式最大、最直观的区别在于,它是从一个既有的对象“克隆...

zhixin9001
46分钟前
7
0
获取免费的pycharm激活码网站

http://www.lookdiv.com/

云烟成雨forever
46分钟前
27
0
用Helm部署Kubernetes应用,支持多环境部署与版本回滚

1 前言 Helm是优秀的基于Kubernetes的包管理器。利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离。现在让我们安...

南瓜慢说
47分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部