上QQ阅读APP看书,第一时间看更新
3.12 函数:put_pid( )
文件包含:
#include <linux/pid.h>
函数定义:
在内核源码中的位置:linux-3.19.3/kernel/pid.c
函数定义格式:void put_pid(struct pid *pid)
函数功能描述:
此函数用于释放进程所占用的Cache空间,但不是每次执行总是成功的,因为只有在进程的用户数量减为1时,即目前没有任何其他任务在使用此进程时,才可以释放此进程所占用的Cache空间;当进程用户的数量大于1时,此函数会减小进程描述符字段count的值,使其减小1。
输入参数说明:
参数pid是struct pid类型的指针变量,保存进程描述符信息,其定义及详细解释请读者自行参考本章函数f ind_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查看内核输出信息,会出现如图3-12所示的结果。
图3-12 插入put_pid模块系统输出信息
结果分析:
由图3-12可以看到在函数put_pid( )执行之前进程描述符字段count的值为3,在函数put_pid( )执行之后进程描述符字段count的值减为2,说明函数put_pid( )能够减少进程描述符字段count的值,此时进程的用户数量为2。