Linux内核API find_get_pid

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,会出现如图所示的结果。
Linux内核API find_get_pid

结果分析:

上图中利用函数f ind_get_pid()能够获得与当前进程相对应的进程描述符信息,当前进程的进程描述符的字段count的值变为3,说明当前进程的任务量为3。

赞(3)
未经允许不得转载:极客笔记 » Linux内核API find_get_pid
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址