对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。 
今天看LWN上的周报,看到有人正在给prctl添加给进程内其它线程命名的接口,并从中得知,给线程自身命名的接口已经存在,不由窃喜,遂写下以下验证代码:

#include 
#include 
#include 
void* tmain(void *arg) 

char name[32]; 
prctl(PR_SET_NAME, (unsigned long)"xx"); 
prctl(PR_GET_NAME, (unsigned long)name); 
printf("%s/n", name); 
while (1) 
sleep(1); 

int main(void) 

pthread_t tid; 
pthread_create(&tid, NULL, tmain, NULL); 
pthread_join(tid, NULL); 
return 0; 
}

编译并运行:

xiaosuo@gentux test $ gcc t_threadname.c -l pthread 
xiaosuo@gentux test $ ./a.out 
xx

在另一个终端,通过ps找到a.out的pid:

xiaosuo@gentux test $ ps aux | grep a.out 
xiaosuo  29882  0.0  0.0  14144   544 pts/6    Sl+  16:23   0:00 ./a.out

看命名是否奏效:

xiaosuo@gentux test $ cd /proc/29882/task/ 
xiaosuo@gentux task $ ls 
29882  29883 
xiaosuo@gentux task $ cd 29883/ 
xiaosuo@gentux 29883 $ cat cmdline 
./a.outxiaosuo@gentux 29883 $

有点儿郁闷,cmdline显示的竟然还是./a.out。通过运行时打印的xx和strace检查prctl的返回值确认prctl确实成功运行。怀疑这个名字只能通过prctl获得,有点儿失落,可心仍不甘。查看ps的man,并实验,终于找到了"xx":

xiaosuo@gentux 29883 $ ps -L -p 29882 
  PID   LWP TTY          TIME CMD 
29882 29882 pts/6    00:00:00 a.out 
29882 29883 pts/6    00:00:00 xx

strace后知道这个“xx”竟然隐匿于stat和status:

xiaosuo@gentux 29883 $ cat stat                                                
29883 (xx) S 7168 29882 7168 34822 29882 4202560 11 0 0 0 2 0 0 0 20 0 2 0 28515372 14483456 136 18446744073709551615 4194304 4196620 140735304261728 18446744073709551615 140435890519585 0 0 0 0 18446744071564503939 0 0 -1 1 0 0 0 0 0       
xiaosuo@gentux 29883 $ cat status                                                
Name:   xx                                                                       
State:  S (sleeping)                                                             
Tgid:   29882                                                                    
Pid:    29883                                                                    
PPid:   7168                                                                     
TracerPid:      0 
Uid:    1000    1000    1000    1000 
Gid:    1000    1000    1000    1000 
FDSize: 256 
Groups: 10 18 1000 1001 1005 
VmPeak:    14144 kB 
VmSize:    14144 kB 
VmLck:         0 kB 
VmHWM:       548 kB 
VmRSS:       544 kB 
VmData:     8388 kB 
VmStk:        84 kB 
VmExe:         4 kB 
VmLib:      1528 kB 
VmPTE:        32 kB 
Threads:        2 
SigQ:   1/40960 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 0000000180000000 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: fffffffffffffeff 
voluntary_ctxt_switches:        4447 
nonvoluntary_ctxt_switches:     0

验毕!:)

为线程命名——prctl相关推荐

  1. 使用prctl为线程命名

    使用prctl的PR_SET_NAME选项功能可以为线程命名,测试代码如下: #include <stdio.h> #include <pthread.h> #include ...

  2. 用prctl给线程命名

    prctl Test name:  prctl Syscall number:  172 Syscall name:  prctl  (man) File name:  prctl.txt  (122 ...

  3. prctl()函数给线程命名

    今天看代码看到一个prctl()函数函数,百度了一下才知道是给线程命名(当然还有其他的功能).下面简述函数的用法: 1.包含的头文件为 sys/prctl.h; 2.函数用法:int 用法:prctl ...

  4. Linux—用prctl()给线程命名

    多线程编程时,如果没有设置每个线程的名字,默认的是进程的名字.为每个线程设置名字,比较好管理和调试:        对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的. 1.函 ...

  5. Java获取当前线程的名字以及为线程命名

    为线程命名可以再构造方法中传入线程的名字,也可以在调用set方法来赋予名字 public class ThreadDemo {public static void main(String[] args ...

  6. Java-多线程-给线程命名

    Java-多线程-给线程命名 在Java中,通过继承Thread创建的线程,有以下两种方式可以给线程命名: 通过构造器命名 因为线程类继承自Thread类,所有也继承了Thread的name属性,可以 ...

  7. [Head First Java] - 给线程命名

    参考 - P503 public class RunThreads implements Runnable {public static void main (String[] args) {RunT ...

  8. muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool

    muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个Event ...

  9. Linux C/C++编程:prctl与pthread_setname_np

    prctl 理论 // 用 prctl 给线程命名, prctl是个系统调用 #include <sys/prctl.h> int prctl(int option, unsigned l ...

  10. java创建线程并命名_Java创建线程的两种方式

    前言 多线程是我们开发过程中经常遇到的,也是必不可少需要掌握的.当我们知道需要进行多线程开发时首先需要知道的自然是如何实现多线程,也就是我们应该如何创建线程. 在Java中创建线程和创建普通的类的对象 ...

最新文章

  1. PyTorch 实现经典模型7:YOLO (v1, v2, v3, v4)
  2. @valid注解_springboot使用自定义注解对接口参数校验
  3. 五十八、2020美赛C题的思路以及个人Python的解法
  4. centos yum install redis
  5. Docker持续集成与容器管理--系列教程
  6. python元素元组抓7_Python7元组,字典,集合
  7. 合泰单片机c语言halt指令,holtek单片机图文全面详解
  8. Linux学习之七--mysql的安装使用
  9. @广州开发者,华为送来一份说明书——助你轻松应对开发难题
  10. matlab坐标加图例,科学网—Matlab 循环添加图例 更改图例位置 - 肖鑫的博文
  11. Python实验-小黑屋
  12. A - Faulty Odometer
  13. CSS:transform应用之立体魔方案例
  14. 业务:金融科技行业分析
  15. mysql定时任务每天凌晨三点钟醒来_linux cron 下的定时执行工具使用技巧
  16. Element ui el-popover实现content显示img格式
  17. SpringWeb项目Maven执行clean命令后编译拒绝访问的解决方法
  18. 练习---打印出电影天堂中电影的下载链接
  19. 阿里巴巴编程规范(new)
  20. 手把手教你使用Keras进行人脸检测和识别

热门文章

  1. Xdebug的优点!php代码开发
  2. mysql 存储过程案列一个。
  3. 散粉在哪个步骤用_如何正确的使用散粉
  4. Lucene查询结果高亮
  5. 理解函数:对象(this,arguments),方法(apply(),call(),bind())。
  6. iOS开发网络篇—GET请求和POST请求(转)
  7. 通过YAJL生成json语句
  8. 什么是字节 什么是数据包
  9. 运维自动化之zabbix(添加Graph screen)(3)
  10. 使用GameKit实现IOS设备之间的蓝牙通信