Linux内核 put_pid()

函数put_pid()用于释放进程所占用的Cache空间,但不是每次执行总是成功的,因为只有在进程的用户数量减为1时,即目前没有任何其他任务在使用此进程时,才可以释放此进程所占用的Cache空间;当进程用户的数量大于1时,此函数会减小进程描述符字段count的值,使其减小1。

文件包含:

        #include <linux/pid.h>

函数定义

在内核源码中的位置:linux-3.19.3/kernel/pid.c

函数定义格式:

void put_pid(struct pid *pid)

输入参数说明:

  • 参数pidstruct pid类型的指针变量,保存进程描述符信息,其定义及详细解释请参考find_get_pid( )

返回参数说明:

  • 此函数的返回值为void类型,即不返回任何值。

实例解析

编写测试文件:put_pid.c

头文件引用:

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

static int __init put_pid_init(void)
{
    printk("into put_pid_init.\n");
    struct pid * kpid=find_get_pid(current->pid);              //获取当前进程描述符
    printk("the count of the pid is :%d\n", kpid->count);       //显示目前进程的用户量
    printk("the level of the pid is :%d\n", kpid->level);       //显示进程的level值

    // 显示进程的PID值
    printk("the pid of the find_get_pid is :%d\n", kpid->numbers[kpid->level].nr);
    put_pid(kpid);                                                  //调用函数释放进程
    printk("the new value after the function put_pid:\n");
    printk("the new count of the pid is:%d\n", kpid->count); //显示函数调用之后count的值
    printk("the new level of the pid is:%d\n", kpid->level); //显示函数调用之后level的值

    // 显示进程的PID值
    printk("the new pid of the thread is:%d\n", kpid->numbers[kpid->level].nr);
    //显示函数kernel_thread( )函数的返回值
    printk("the pid of current thread is :%d\n", current->pid);
    printk("out put_pid_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit put_pid_exit(void)
{
    printk("Goodbye put_pid\n");
}

模块加载、退出函数调用:

module_init(put_pid_init);
module_exit(put_pid_exit);

实例运行结果及分析

首先编译模块,执行命令insmod put_pid.ko插入模块,然后执行命令dmesg -c查看内核输出信息,会出现如图所示的结果。

Linux内核 put_pid()

结果分析:

由上图可以看到在函数put_pid()执行之前进程描述符字段count的值为3,在函数put_pid()执行之后进程描述符字段count的值减为2,说明函数put_pid()能够减少进程描述符字段count的值,此时进程的用户数量为2。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!