find_get_pid 函数功能描述:此函数根据提供的进程号获取对应的进程描述符,并使进程描述符中的字段count的值加1,即此进程的用户数加1。
find_get_pid文件包含
#include <linux/pid.h>
find_get_pid函数定义
在内核源码中的位置:linux-3.19.3/kernel/pid.c
函数定义格式:
struct pid *f ind_get_pid(int nr)
find_get_pid输入参数说明
参数nr是int型变量,是进程对应的进程号。
find_get_pid返回参数说明
此函数返回与参数提供的进程号对应的进程描述符,进程描述符的定义如下:
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值。
find_get_pid实例解析
编写测试文件:find_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,会出现如图所示的结果。
结果分析:
上图中利用函数f ind_get_pid()能够获得与当前进程相对应的进程描述符信息,当前进程的进程描述符的字段count的值变为3,说明当前进程的任务量为3。