上QQ阅读APP看书,第一时间看更新
3.3 函数:find_pid_ns( )
文件包含:
#include <linux/pid.h>
函数定义:
在内核源码中的位置:linux-3.19.3/kernel/pid.c
函数定义格式:struct pid *f ind_pid_ns(int nr, struct pid_namespace *ns)
函数功能描述:
此函数获取进程的进程描述符,此进程应满足如下约束条件:
1)进程的进程号和参数nr相同。
2)保证进程描述符的pid_namespace和参数ns相同。
输入参数说明:
参数nr是与获取的进程描述符对应的进程号。
参数ns是struct pid_namespace型变量,是对进程命名空间信息的描述,其定义及详细解释请读者自行参考本章函数__task_pid_nr_ns( )分析文档的输入参数说明部分。
返回参数说明:
此函数的返回结果是struct pid结构体类型的指针,保存符合条件的进程的描述符信息,其定义及详细解释请读者自行参考本章函数f ind_get_pid( )分析文档的返回参数说明部分。
实例解析:
编写测试文件:f ind_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 f ind_pid_ns.ko插入模块,然后执行命令dmesg -c查看内核输出信息,会出现如图3-3所示的结果。
图3-3 插入f ind_pid_ns模块系统输出信息
结果分析:
由图3-3可以看出函数f ind_pid_ns( )能够获得与输入参数相对应的进程的进程描述符,当前进程的进程号是10264。