1. prctl 系统调用函数
$ man 2 prctl //prctl - operations on a process //#include <sys/prctl.h> int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); //return 0 on success. On error, -1 is returned, and errno is set appropriately.
2. prctl设置进程名内核响应
SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5)//kernel/sys.c { ... switch (option) { ... case PR_SET_NAME: comm[sizeof(me->comm) - 1] = 0; if (strncpy_from_user(comm, (char __user *)arg2, sizeof(me->comm) - 1) < 0) return -EFAULT; set_task_comm(me, comm); proc_comm_connector(me); break ... } ... }
可见 arg2 就是要设置的进程名,arg1需要为 PR_SET_NAME,其它参数不用管。
3. 实验程序
#include <stdio.h> #include <unistd.h> #include <sys/prctl.h> int main() { int ret = prctl(PR_SET_NAME, "hello_world", NULL, NULL, NULL); printf("ret=%d ", ret); while(1) { sleep(1); } return 0; }
测试结果:
$ gcc prctl_test.c -o pp $ ./pp & [2] 39844 $ ret=0 $ cat /proc/39844/comm hello_world $ ps -AT | grep 39844 39844 39844 pts/13 00:00:00 hello_world