Linux内核API完全参考手册(第2版)
上QQ阅读APP看书,第一时间看更新

3.8 函数:ns_of_pid( )

文件包含:

        #include <linux/pid.h>

函数定义:

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

函数定义格式:

        static inline struct pid_namespace * ns_of_pid(struct pid *pid)
        {
            struct pid_namespace *ns = NULL;
            if (pid)
                  ns = pid->numbers[pid->level].ns;
            return ns;
        }

函数功能描述:

此函数用于获取进程的命名空间的信息,根据参数(进程描述符)获得信息。

输入参数说明:

此函数的输入参数是struct pid结构体类型的指针变量,保存进程描述符信息,其定义及详细解释请读者自行参考本章函数f ind_get_pid( )分析文档的返回参数说明部分。

返回参数说明:

此函数的返回结果是struct pid_namespace型变量,是对进程命名空间信息的描述,其定义及详细解释请读者自行参考本章函数__task_pid_nr_ns( )分析文档的输入参数说明部分。

实例解析:

编写测试文件:ns_of_pid.c

头文件引用:

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

模块加载函数定义:

        static int __init ns_of_pid_init(void)
        {
            printk("into ns_of_pid_init.\n");
            struct pid * kpid=find_get_pid(current->pid);       //获取当前进程的描述符
            printk("the level of the pid is:%d\n", kpid->level); //显示新进程的level值

            // 显示新进程的PID值
            printk("the pid of the pid is:%d\n", kpid->numbers[kpid->level].nr);
            struct pid_namespace * pid_ns = ns_of_pid(kpid);    //获取新进程的命名空间

            // 显示命令空间的level值
            printk("the level of the pid_namespace is:%d\n", pid_ns->level);

            // 显示命名空间的last_pid值
            printk("the last_pid of the pid_namespace is:%d\n", pid_ns->last_pid);
            printk("the current pid is:%d\n", current->pid);     //显示当前进程的PID
            printk("he current tgid is:%d\n", current->tgid);    //显示当前进程的TGID
            printk("out ns_of_pid_init.\n");
            return 0;
        }

模块退出函数定义:

        static void __exit ns_of_pid_exit(void)
        {
            printk("Goodbye   ns_of_pid\n");
        }

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

        module_init(ns_of_pid_init);
        module_exit(ns_of_pid_exit);

实例运行结果及分析:

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

图3-8 插入ns_of_pid模块系统输出信息

结果分析:

由图3-8可以看出当前进程命名空间所处的命名空间的层次深度是0,即此空间是初始命名空间;last_pid的值是14391,与当前进程的进程号相同,说明此命名空间是新创建的,没有被任何其他进程使用;从程序的运行结果可以判断函数ns_of_pid( )能够根据进程描述符获得其命名空间信息。