Skip to main content
 首页 » 操作系统

Linux prctl系统调用设置进程名

2022年07月19日23sharpest

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\n", 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

补充:

4. 给线程重命名

int create_touch_handler() 
{ 
    pthread_t handlerThread; 
    pthread_attr_t attr; 
 
    pthread_attr_init(&attr); 
    pthread_create(&handlerThread, &attr, TouchHandler, NULL); 
    pthread_setname_np(handlerThread, "PowerTouch"); //给线程重命名 
 
    return 0; 
}

本文参考链接:https://www.cnblogs.com/hellokitty2/p/15506178.html