Linux内核API find_pid_ns

find_pid_ns函数功能描述

此函数获取进程的进程描述符,此进程应满足如下约束条件:

1)进程的进程号和参数nr相同。

2)保证进程描述符的pid_namespace和参数ns相同。

find_pid_ns文件包含

#include <linux/pid.h>

find_pid_ns函数定义

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

函数定义格式:

struct pid *f ind_pid_ns(int nr, struct pid_namespace *ns)

find_pid_ns输入参数说明

  • 参数nr是与获取的进程描述符对应的进程号。
  • 参数ns是struct pid_namespace型变量,是对进程命名空间信息的描述,其定义及详细解释请参考函数__task_pid_nr_ns()分析文档的输入参数说明部分。

find_pid_ns返回参数说明

此函数的返回结果是struct pid结构体类型的指针,保存符合条件的进程的描述符信息,其定义及详细解释请参考函数find_get_pid()分析文档的返回参数说明部分。

find_pid_ns实例解析

编写测试文件:find_pid_ns.c

头文件引用:

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

模块加载函数定义:

static int __init find_pid_ns_init(void)
{
    int result;
    printk("into find_pid_ns_init.\n");

    //调用函数find_get_pid( )获取当前进程的描述符
    struct pid * kpid=find_get_pid(current->pid);
    //调用函数find_pid_ns( )获取进程的描述符
    struct pid * fpid=find_pid_ns(kpid->numbers[kpid->level].nr, kpid->numbers
[kpid->level].ns);

    // 显示函数执行结果的进程描述符信息
    printk("the find_pid_ns result's count is:%d\n", fpid->count);
    printk("the find_pid_ns result's level is:%d\n", fpid->level);

    // 显示函数执行结果的进程号
    printk("the find_pid_ns result's pid is:%d\n", fpid->numbers[fpid->level].nr);
    printk("the pid of current thread is:%d\n", current->pid); //当前进程的进程号
    printk("out find_pid_ns_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit find_pid_ns_exit(void)
{
    printk("Goodbye   find_pid_ns\n");
}

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

module_init(find_pid_ns_init);
module_exit(find_pid_ns_exit);

实例运行结果及分析:

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

Linux内核API find_pid_ns

结果分析:

由上图可以看出函数find_pid_ns( )能够获得与输入参数相对应的进程的进程描述符,当前进程的进程号是10264。

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

评论 抢沙发

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