您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何進行prctl()函數(shù)應(yīng)用,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
t prctl(int option,unsigned longarg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)
這個系統(tǒng)調(diào)用指令是為進程制定而設(shè)計的,明確的選擇取決于option:
PR_GET_PDEATHSIG :返回處理器信號;
PR_SET_PDEATHSIG :arg2作為處理器信號pdeath被輸入,正如其名,如果父進程不能再用,進程接受這個信號。
PR_GET_DUMPABLE :返回處理器標志dumpable;
PR_SET_DUMPABLE :arg2作為處理器標志dumpable被輸入。
PR_GET_NAME :返回調(diào)用進程的進程名字給參數(shù)arg2; (Since Linux2.6.9)
PR_SET_NAME :把參數(shù)arg2作為調(diào)用進程的經(jīng)常名字。(SinceLinux 2.6.11)
PR_GET_TIMING :
PR_SET_TIMING :判定和修改進程計時模式,用于啟用傳統(tǒng)進程計時模式的
PR_TIMING_STATISTICAL,或用于啟用基于時間戳的進程計時模式的
PR_TIMING_TIMESTAMP。
CAP_CHOWN功能:
在一個_POSIX_CHOWN_RESTRICTED功能定義的系統(tǒng)。這會越過改變系統(tǒng)文件所有者和組所有的權(quán)限
CAP_DAC_OVERRIED功能:
如果_POSIX_ACL定義,就會越過所有的DAC訪問,包括ACL執(zhí)行訪問,用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功能:
越過當(dāng)設(shè)置文件的S_ISUID和S_ISGID位的時候,用戶的ID必須和所有者ID匹配的限制,設(shè)置S-ISGID位的時候,組ID
必須和所有者ID匹配的限制,用chown來設(shè)置S_ISUID和S_ISGID為的功能限制
CAP_FS_MASK功能:
用來回應(yīng)suser()或是fsuser()。
CAP_KILL功能:
一個有有效用戶ID的進程發(fā)送信號時必須匹配有效用戶ID的功能會越過
CAP_SETGID功能:
允許setgid() 功能, 允許setgroups()
允許在socket里偽造gid
CAP_SETUID功能:
允許set*uid()功能 允許偽造pid在socket
CAP_SETPCAP 功能:
把所有的許可給所有的pid?;蚴前阉械脑S可刪除
CAP_LINUX_IMMUTABLE功能:
允許更改S_IMMUTABLE和S_APPEND文件屬性
CAP_NET_BIND_SERVICE功能:
允許綁定1024下的TCP/UDP套接字
CAP_NET_BROADCAST功能:
允許廣播,監(jiān)聽多點傳送
CAP_NET_ADMIN功能:
允許配置接口
允許管理IP防火墻IP偽裝和帳戶
允許配置socket調(diào)試選項
允許修改路由表
允許配置socket上的進程的組屬性
允許綁定所有地址的透明代理
允許配置TOS(服務(wù)類型)
允許配置混雜模式
允許清除驅(qū)動狀態(tài)
允許多點傳送
允許讀或?qū)懴到y(tǒng)記錄
CAP_NET_RAW功能:
允許用RAW套接字
允許用PACKET套接字
CAP_IPC_LOCK功能:
允許瑣定共享內(nèi)存段
允許mlock和mlockall
CAP_IPC_OWNER功能:
越過IPC所有權(quán)檢查
CAP_SYS_MODULE功能:
插入或刪除內(nèi)核模塊
CAP_SYS_RAWIO功能:
允許ioperm/iopl和/dev/prot的訪問
允許/dev/mem和/dev/kmem訪問
允許塊設(shè)備訪問(/dev/[sh]d??)
CAP_SYS_CHROOT功能:
允許chroot()
CAP_SYS_PTRACE功能:
允許ptrace()任何進程
CAP_SYS_PACCT功能:
允許配置進程帳號
CAP_SYS_ADMIN功能:
允許配置安全鑰匙
允許管理隨機設(shè)備
允許設(shè)備管理
允許檢查和配置磁盤限額
允許配置內(nèi)核日志
允許配置域名
允許配置主機名
允許調(diào)用bdflush()命令
允許mount()和umount()命令
允許配置smb連接
允許root的ioctls
允許nfsservctl
允許VM86_REQUEST_IRQ
允許在alpha上讀寫pci配置
允許在mips上的irix_prctl
允許刷新所有的m68k緩存
允許刪除semaphores
用CAP_CHOWN去代替"chown"IPC消息隊列,標志和共享內(nèi)存
允許鎖定或是解鎖共享內(nèi)存段
允許開關(guān)swap
允許在socket偽裝pids
允許設(shè)置塊設(shè)備的緩存刷新
允許設(shè)置軟盤驅(qū)動器
允許開關(guān)DMA開關(guān)
允許管理md設(shè)備
允許管理ide驅(qū)動
允許訪問nvram設(shè)備
允許管理apm_bios,串口或是bttv電視設(shè)備
允許在isdn CAPI的驅(qū)動下生成命令
允許讀取pci的非標準配置
允許DDI調(diào)試ioctl
允許發(fā)送qic-117命令
允許啟動或禁止SCSI的控制和發(fā)送SCSI命令 允許配置加密口令在回路文件系統(tǒng)上
CAP_SYS_BOOT功能:
允許用reboot() 命令
CAP_SYS_NICE功能:
允許提高或設(shè)置其他進程的優(yōu)先權(quán)
允許在自己的進程用FISO和實時的安排和配置
CAP_SYS_RESOURCE功能:
越過資源限制,設(shè)置資源限制
越過配額限制
越過保留的ext2文件系統(tǒng)
允許大于64hz的實時時鐘中斷
越過最大數(shù)目的控制終端
越過最大數(shù)目的鍵
CAP_SYS_TIME功能:
允許處理系統(tǒng)時鐘
允許_stime
允許設(shè)置實時時鐘
CAP_SYS_TTY_CONFIG功能:
允許配置終端設(shè)備
允許vhangup()終端
返回值
PR_GET_DUMPABLE 和 PR_GET_KEEPCAPS 成功時返回0或者1。其他的option值都是成功時返回0。
錯誤時返回 -1,并設(shè)置相應(yīng)的錯誤號。
EINVAL————option的值不正確,或者當(dāng)它是PR_SET_PDEATHSIG時,參數(shù)arg2的值不是0或者信號數(shù)字。
EBADF————無效的描述符
實例:于多線程應(yīng)用程序,如果能夠給每個線程命名,那么調(diào)試起來的便利是不言而喻的。
#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下進程重命名的方法:
使用系統(tǒng)函數(shù)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);
第一個參數(shù)是操作類型,指定PR_SET_NAME,即設(shè)置進程名
第二個參數(shù)是進程名字符串,長度至多16字節(jié)
以上就是如何進行prctl()函數(shù)應(yīng)用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。