prctl()函数应用

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

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

今天看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
      验毕!:)
  
 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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