prctl系统调用设置进程名

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,其它参数不用管。此外 prctl() 还可以获取进程名字,设置 timerslack; 此外还有 getcpu() 系统调用,可以查看当前进程运行在哪个CPU上了。

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;
}

 

posted on 2021-11-03 22:58  Hello-World3  阅读(1151)  评论(0编辑  收藏  举报

导航