【轉】prctl()函數應用 prctl()函數應用

prctl()函數應用


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 Linux2.6.9)
 
PR_SET_NAME :把參數arg2作爲調用進程的經常名字。(SinceLinux 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————無效的描述符
 
實例:於多線程應用程序,如果能夠給每個線程命名,那麼調試起來的便利是不言而喻的。
#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 -lpthread
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


Linux下進程重命名的方法:


使用系統函數prctl(),聲明如下:


#include <sys/prctl.h>


int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);
具體用法請參考http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html


 進程重命名代碼:


prctl(PR_SET_NAME, “process_name”, NULL, NULL, NULL);
第一個參數是操作類型,指定PR_SET_NAME,即設置進程名


第二個參數是進程名字符串,長度至多16字節

from: http://blog.csdn.net/zuokong/article/details/7318154


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章