Linux内核API task_active_pid_ns

task_active_pid_ns函数功能描述:此函数用于获取任务中包含进程的命名空间信息,函数执行如下:首先调用函数task_pid( )获得任务字段pids[PIDTYPE_PID]的pid值,然后调用函数ns_of_pid()获取函数task_pid( )返回值的命名空间信息。

task_active_pid_ns文件包含

#include <linux/pid_namespace.h>

task_active_pid_ns函数定义

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

函数定义格式:

struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)

task_active_pid_ns输入参数说明

参数tsk是struct task_struct结构体类型的变量指针,保存任务描述符信息,其定义参见内核源码文件linux-3.19.3/include/linux/sched.h,内核注释比较详细,请读者自行分析。

task_active_pid_ns返回参数说明

函数返回结果是struct pid_namespace型变量,是对进程命名空间信息的描述,其定义及详细解释参考__task_pid_nr_ns()

task_active_pid_ns实例解析

编写测试文件:task_active_pid_ns.c

头文件引用:

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

模块加载函数定义:

static int __init task_active_pid_ns_init(void)
{
    printk("into task_active_pid_ns_init.\n");
    struct pid * kpid=find_get_pid(current->pid);           //获取当前进程描述符
    struct task_struct * task=pid_task(kpid, PIDTYPE_PID); //获取任务描述符
    struct pid_namespace * ns=task_active_pid_ns(task);     //获取任务中进程的命名空间

    // 显示进程的PID
    printk("the pid of the find_get_pid result is :%d\n", kpid->numbers[kpid->level].nr);

    // 显示命名空间字段last_pid的值
    printk("the last_pid of the task_active_pid_ns result is:%d\n", ns->last_pid);

    printk("the pid of current thread is :%d\n", current->pid); //显示当前进程的PID
    printk("out task_active_pid_ns_init.\n");
      return 0;
  }

模块退出函数定义:

static void __exit task_active_pid_ns_exit(void)
{
    printk("Goodbye task_active_pid_ns\n");
}

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

module_init(task_active_pid_ns_init);
module_exit(task_active_pid_ns_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod task_active_pid_ns.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API task_active_pid_ns

结果分析:

由图可以看出函数task_active_pid_ns( )能够获得与任务相对应的进程的命名空间信息,当前进程的PID值为17353,命名空间的字段last_pid的值也为17353,因为此进程只被目前一个任务使用,所以任务对应进程的命名空间的last_pid和此任务的进程的PID值相同。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程