Linux内核API完全参考手册(第2版)
上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。