prctl()函数应用

举报
CodeAllen 发表于 2021/10/29 23:53:15 2021/10/29
【摘要】 对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。 今天看LWN上的周报,看到有人正在给prctl添加给进程内其它线程命名的接口,并从中得知,给线程自身命名的接口已经存在,不由窃喜,遂写下以下验证代码: #include#include#include void* tmain(void *arg){ cha...

对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。

今天看LWN上的周报,看到有人正在给prctl添加给进程内其它线程命名的接口,并从中得知,给线程自身命名的接口已经存在,不由窃喜,遂写下以下验证代码:


  
  1. #include
  2. #include
  3. #include
  4. void* tmain(void *arg)
  5. {
  6. char name[32]; 
  7. prctl(PR_SET_NAME, (unsigned long)"xx"); 
  8. prctl(PR_GET_NAME, (unsigned long)name);
  9. printf("%s/n", name);
  10. while (1)
  11. sleep(1);
  12. }
  13. int main(void)
  14. {
  15. pthread_t tid;
  16. pthread_create(&tid, NULL, tmain, NULL);
  17. pthread_join(tid, NULL);
  18. return 0;
  19. }

编译并运行:


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

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


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

看命名是否奏效:


  
  1. xiaosuo@gentux test $ cd /proc/29882/task/
  2. xiaosuo@gentux task $ ls
  3. 29882  29883
  4. xiaosuo@gentux task $ cd 29883/
  5. xiaosuo@gentux 29883 $ cat cmdline
  6. ./a.outxiaosuo@gentux 29883 $

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


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

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


  
  1. xiaosuo@gentux 29883 $ cat stat                                               
  2. 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      
  3. xiaosuo@gentux 29883 $ cat status                                               
  4. Name:   xx                                                                      
  5. State:  S (sleeping)                                                            
  6. Tgid:   29882                                                                   
  7. Pid:    29883                                                                   
  8. PPid:   7168                                                                    
  9. TracerPid:      0
  10. Uid:    1000    1000    1000    1000
  11. Gid:    1000    1000    1000    1000
  12. FDSize: 256
  13. Groups: 10 18 1000 1001 1005
  14. VmPeak:    14144 kB
  15. VmSize:    14144 kB
  16. VmLck:         0 kB
  17. VmHWM:       548 kB
  18. VmRSS:       544 kB
  19. VmData:     8388 kB
  20. VmStk:        84 kB
  21. VmExe:         4 kB
  22. VmLib:      1528 kB
  23. VmPTE:        32 kB
  24. Threads:        2
  25. SigQ:   1/40960
  26. SigPnd: 0000000000000000
  27. ShdPnd: 0000000000000000
  28. SigBlk: 0000000000000000
  29. SigIgn: 0000000000000000
  30. SigCgt: 0000000180000000
  31. CapInh: 0000000000000000
  32. CapPrm: 0000000000000000
  33. CapEff: 0000000000000000
  34. CapBnd: fffffffffffffeff
  35. voluntary_ctxt_switches:        4447
  36. nonvoluntary_ctxt_switches:     0
  37. 验毕!:)

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/118738980

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。