Linux内核API pid_nr

pid_nr函数功能描述:函数pid_nr( )用于获取进程的全局进程号,根据输入参数所代表的进程描述符获取全局进程号。

pid_nr文件包含

#include <linux/pid.h>

pid_nr函数定义

在内核源码中的位置:linux-3.19.3/include/linux/pid.h

函数定义格式:

static inline pid_t pid_nr(struct pid *pid)
{
    pid_t nr = 0;
    if (pid)
        nr = pid->numbers[0].nr;
    return nr;
}

pid_nr输入参数说明

此函数的输入参数是struct pid结构体类型的指针变量,保存进程描述符信息,其定义及详细解释参考find_get_pid( )

pid_nr返回参数说明

此函数的返回值是pid_t类型的变量,在此代表获取的进程的全局进程号,
pid_t的定义见文件linux-3.19.3/include/linux/types.h,如下:

typedef  __kernel_pid_t  pid_t。

其中__kernel_pid_t的定义见文件linux-3.19.3/include/uapi/asm-generic/posix_types.h,如下:

#ifndef __kernel_pid_t
typedef   int   __kernel_pid_t;
#endif

pid_nr实例解析

编写测试文件:pid_nr.c

头文件引用:

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

static int __init pid_nr_init(void)
{
    printk("into pid_nr_init.\n");
    struct pid * kpid=find_get_pid(current->pid);          //获取当前进程的描述符
    printk("the level of the pid is:%d\n", kpid->level); //显示进程描述符的level的值
    printk("the pid of the pid is:%d\n", kpid->numbers[kpid->level].nr);
                                                            //显示进程的进程号
    int nr = pid_nr(kpid);                                  //获取进程描述符的全局进程号
    printk("the pid_nr result is:%d\n", nr);                //显示全局进程号
    printk("the current pid is:%d\n", current->pid);        //显示当前进程的进程号
    printk("the current tgid is:%d\n", current->tgid);      //显示当前进程的线程组号
    printk("out pid_nr_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit pid_nr_exit(void)
{
    printk("Goodbye pid_nr\n");
}

模块加载、退出函数调用:

module_init(pid_nr_init);
module_exit(pid_nr_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod pid_nr.ko插入模块,然后执行命令dmesg -c查看内核输出信息,会出现如图所示的结果。

Linux内核API pid_nr

结果分析:

上图输出结果显示当前进程的进程号为15552,函数pid_nr( )获取的全局进程号也是15552,其实全局进程号就是一般意义上说的进程号,二者相同。

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

评论 抢沙发

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