上QQ阅读APP看书,第一时间看更新
3.2 函数:find_get_pid( )
文件包含:
#include <linux/pid.h>
函数定义:
在内核源码中的位置:linux-3.19.3/kernel/pid.c
函数定义格式:struct pid *f ind_get_pid(int nr)
函数功能描述:
此函数根据提供的进程号获取对应的进程描述符,并使进程描述符中的字段count的值加1,即此进程的用户数加1。
输入参数说明:
参数nr是int型变量,是进程对应的进程号。
返回参数说明:
此函数返回与参数提供的进程号对应的进程描述符,进程描述符的定义如下:
struct pid { atomic_t count; unsigned int level; /* 当前pid所属任务的链表*/ struct hlist_head tasks[PIDTYPE_MAX]; struct rcu_head rcu; struct upid numbers[1]; };
其中:
字段count代表当前使用此进程的任务数量。
字段level对应字段number[]数组的下标,一般取值为0。
字段tasks是当前使用此进程的任务列表。
字段numbers是struct upid类型的数组,定义如下:
struct upid { int nr; struct pid_namespace *ns; struct hlist_node pid_chain; };
此结构体也是用于保存进程的一些相关信息,其中字段nr保存进程的局部PID值。
实例解析:
编写测试文件:f ind_get_pid.c
头文件引用:
#include <linux/module.h> #include <linux/sched.h> #include <linux/pid.h> MODULE_LICENSE("GPL");
模块加载函数定义:
static int __init find_get_pid_init(void) { printk("into find_get_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); // 显示进程号 printk("the pid of the find_get_pid is :%d\n", kpid->numbers[kpid->level].nr); printk("out find_get_pid_init.\n"); return 0; }
模块退出函数定义:
static void __exit find_get_pid_exit(void) { printk("Goodbye find_get_pid\n"); }
模块加载和退出函数调用:
module_init(find_get_pid_init); module_exit(find_get_pid_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod f ind_get_pid.ko插入模块,然后执行命令dmesg -c,会出现如图3-2所示的结果。
图3-2 插入f ind_get_pid模块系统输出信息
结果分析:
图3-2中利用函数f ind_get_pid( )能够获得与当前进程相对应的进程描述符信息,当前进程的进程描述符的字段count的值变为3,说明当前进程的任务量为3。