用prctl给线程命名

prctl

Test name:  prctl

Syscall number:  172

Syscall name:  prctl  (man)

File name:  prctl.txt  (1225 bytes)

* * 说 明 * *

int prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)



这个系统调用指令是为进程制定而设计的,明确的选择取决于option:



	PR_GET_PDEATHSIG :返回处理器信号;



	PR_SET_PDEATHSIG :arg2作为处理器信号pdeath被输入,正如其名,如果父进程不能再用,进程接受这个信号。



	PR_GET_DUMPABLE :返回处理器标志dumpable;



	PR_SET_DUMPABLE :arg2作为处理器标志dumpable被输入。



	PR_GET_NAME :返回调用进程的进程名字给参数arg2; (Since Linux 2.6.9)



	PR_SET_NAME :把参数arg2作为调用进程的经常名字。(Since Linux 2.6.11)



	PR_GET_TIMING :



	PR_SET_TIMING :判定和修改进程计时模式,用于启用传统进程计时模式的 



        PR_TIMING_STATISTICAL,或用于启用基于时间戳的进程计时模式的 



        PR_TIMING_TIMESTAMP。




         CAP_CHOWN功能: 

                    在一个_POSIX_CHOWN_RESTRICTED功能定义的系统。这会越过改变系统文件所有者和组所有的权限 



         CAP_DAC_OVERRIED功能: 

                     如果_POSIX_ACL定义,就会越过所有的DAC访问,包括ACL执行访问,用CAP_LINUX_IMMUTABLE功能来排除

                     DAC的访问 



         CAP_DAC_READ_SEARCH功能: 

                     如果_POSIX_ACL定义,就会越过所有的DAC的读限制,

                     并在所有的文件和目录里搜索,包括ACL限制。用CAP_LINUX_IMMUTABLE来限制DAC访问 



         CAP_FOWNER功能:

                      越过文件说有的允许限制,如文件的所有者ID必须和用户ID一样,除了CAP_FSETID可用。它不会越过MAC和DAC限制 



         CAP_FSETID功能: 

                        越过当设置文件的S_ISUID和S_ISGID位的时候,用户的ID必须和所有者ID匹配的限制,设置S-ISGID位的时候,组ID

                     必须和所有者ID匹配的限制,用chown来设置S_ISUID和S_ISGID为的功能限制 



         CAP_FS_MASK功能: 

                用来回应suser()或是fsuser()。 



          CAP_KILL功能: 

                  一个有有效用户ID的进程发送信号时必须匹配有效用户ID的功能会越过 



           CAP_SETGID功能: 

                     允许setgid() 功能, 允许setgroups() 

                     允许在socket里伪造gid 



          CAP_SETUID功能: 

                      允许set*uid()功能 允许伪造pid在socket 



          CAP_SETPCAP 功能: 

                       把所有的许可给所有的pid。或是把所有的许可删除 



           CAP_LINUX_IMMUTABLE功能: 

                      允许更改S_IMMUTABLE和S_APPEND文件属性 



           CAP_NET_BIND_SERVICE功能: 

                      允许绑定1024下的TCP/UDP套接字 



           CAP_NET_BROADCAST功能: 

                      允许广播,监听多点传送 



           CAP_NET_ADMIN功能:

                      允许配置接口 

                          允许管理IP防火墙IP伪装和帐户 

                          允许配置socket调试选项 

                          允许修改路由表 

                          允许配置socket上的进程的组属性 

                          允许绑定所有地址的透明代理 

                          允许配置TOS(服务类型) 

                          允许配置混杂模式 

                          允许清除驱动状态 

                          允许多点传送 

                          允许读或写系统记录 



            CAP_NET_RAW功能: 

                           允许用RAW套接字 

                           允许用PACKET套接字 



            CAP_IPC_LOCK功能: 

                           允许琐定共享内存段 

                            允许mlock和mlockall 



            CAP_IPC_OWNER功能: 

                            越过IPC所有权检查 



             CAP_SYS_MODULE功能:

                             插入或删除内核模块



              CAP_SYS_RAWIO功能: 

                             允许ioperm/iopl和/dev/prot的访问 

                              允许/dev/mem和/dev/kmem访问 

                              允许块设备访问(/dev/[sh]d??) 



             CAP_SYS_CHROOT功能: 

                                允许chroot() 



              CAP_SYS_PTRACE功能: 

                               允许ptrace()任何进程 



               CAP_SYS_PACCT功能: 

                               允许配置进程帐号



               CAP_SYS_ADMIN功能: 

                                允许配置安全钥匙 

				允许管理随机设备 

				允许设备管理 

				允许检查和配置磁盘限额 

				允许配置内核日志 

				允许配置域名 

				允许配置主机名 

				允许调用bdflush()命令 

				允许mount()和umount()命令 

				允许配置smb连接 

				允许root的ioctls 

				允许nfsservctl 

				允许VM86_REQUEST_IRQ 

				允许在alpha上读写pci配置 

				允许在mips上的irix_prctl 

				允许刷新所有的m68k缓存

                                允许删除semaphores

                                用CAP_CHOWN去代替"chown"IPC消息队列,标志和共享内存 

				允许锁定或是解锁共享内存段 

				允许开关swap 

				允许在socket伪装pids 

				允许设置块设备的缓存刷新 

				允许设置软盘驱动器 

				允许开关DMA开关 

				允许管理md设备 


				允许管理ide驱动 

				允许访问nvram设备 

				允许管理apm_bios,串口或是bttv电视设备 

				允许在isdn CAPI的驱动下生成命令 

				允许读取pci的非标准配置 

				允许DDI调试ioctl 

				允许发送qic-117命令 

				允许启动或禁止SCSI的控制和发送SCSI命令 允许配置加密口令在回路文件系统上 



		CAP_SYS_BOOT功能: 

				允许用reboot() 命令 



		CAP_SYS_NICE功能: 

				允许提高或设置其他进程的优先权 

				允许在自己的进程用FISO和实时的安排和配置 



		CAP_SYS_RESOURCE功能: 

				越过资源限制,设置资源限制 

				越过配额限制 

				越过保留的ext2文件系统 

				允许大于64hz的实时时钟中断 

				越过最大数目的控制终端 

				越过最大数目的键 



		CAP_SYS_TIME功能: 

				允许处理系统时钟 

				允许_stime 

				允许设置实时时钟 



		CAP_SYS_TTY_CONFIG功能:

				允许配置终端设备 

				允许vhangup()终端



返回值



	PR_GET_DUMPABLE 和  PR_GET_KEEPCAPS 成功时返回0或者1。其他的option值都是成功时返回0。 

                                               错误时返回 -1,并设置相应的错误号。



	EINVAL————option的值不正确,或者当它是PR_SET_PDEATHSIG 时,参数arg2的值不是0或者信号数字。



	EBADF————无效的描述符


 

 

以下转自:http://blog.chinaunix.net/u/5251/showart.php?id=2087202

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

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

#include<stdio.h>
#include<pthread.h>
#include<sys/prctl.h>

void* tmain(void*arg)
{
        char name[32];
        prctl(PR_SET_NAME,(unsignedlong)"xx");
        prctl(PR_GET_NAME,(unsignedlong)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 - eL - o pid,user,lwp,comm
top
- H

 

在 另一个终端,通过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给线程命名)