Linux内核API pid_vnr

pid_vnr函数功能描述:函数pid_vnr( )根据输入参数,获取进程的局部进程号。

pid_vnr文件包含

#include <linux/pid.h>

pid_vnr函数定义

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

函数定义格式:

pid_t pid_vnr(struct pid *pid)

pid_vnr输入参数说明

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

pid_vnr返回参数说明

此函数的返回值是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_vnr实例解析

编写测试文件:pid_vnr.c

头文件引用:

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

模块加载函数定义:

static int __init pid_vnr_init(void)
{
    printk("into pid_vnr_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 vnr = pid_vnr(kpid);                                //获取进程描述符的局部进程号
    printk("the pid_vnr result is:%d\n", vnr);              //显示局部进程号
    printk("the current pid is:%d\n", current->pid);        //显示当前进程的进程号
    printk("the current tgid is:%d\n", current->tgid);      //显示当前进程的线程组号
    printk("out pid_vnr_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit pid_vnr_exit(void)
{
    printk("Goodbye pid_vnr\n");
}

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

module_init(pid_vnr_init);
module_exit(pid_vnr_exit);

实例运行结果及分析:

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

Linux内核API pid_vnr

结果分析:

上图输出结果显示函数pid_vnr( )获取的局部进程号是16558,而当前进程的进程号和组进程号都是16558,一般进程的进程号和进程的局部进程号是相同的。

函数分析比较:

函数pid_nr( )和函数pid_vnr( )都能获得进程的进程号,但一个是全局进程号,一个是局部进程号,获取全局进程号比较简单,因为全局进程号就是保存在进程描述符中的进程的PID值,与当前进程无关。而局部进程号的获取相对比较复杂,需要调用函数pid_nr_ns( )去获取进程的局部进程号,在获取局部进程号时还需要判断进程的命名空间信息。

全局进程号和局部进程号的区别:

全局ID是在内核本身和初始命名空间中的唯一ID号,在系统启动期间开始的init进程即属于初始命名空间。对每个ID类型,都有一个给定的全局ID,保证在整个系统中是唯一的。

局部ID属于某个特定的命名空间,不具备全局有效性。对于每个ID类型,它们在所属的命名空间内部有效,但类型相同、值也相同的ID可能出现在不同的命名空间中。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程