2.8 函数:module_is_live( )
文件包含:
#include <linux/module.h>
函数定义:
在内核源码中的位置:linux-3.19.3/include/linux/ module.h
函数定义格式:static inline int module_is_live(struct module *mod)
函数功能描述:
该函数的功能是判断模块mod是否处于活动状态。
输入参数说明:
mod:模块结构体指针,结构体中包含模块的名称、状态、所属的模块链表等。关于结构体struct module的定义,请参见本章中f ind_module( )函数的分析。
返回参数说明:
该函数返回一个整型值,如果为1表示模块处于live(not going)状态;如果为0,则模块mod处于going状态。
实例解析:
编写测试文件:module_is_live.c
头文件及全局变量声明如下:
#include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("GPL"); static int __init module_is_live_init(void); static void __exit module_is_live_exit(void); static int ret; //接收返回值
模块初始化函数:
int __init module_is_live_init(void) { ret = module_is_live(THIS_MODULE); //参数为当前模块 if( ret == 1 ) printk("in init, state is:not GOING! \n"); else printk("in init, state is:GOING\n"); return 0; }
模块退出函数:
void __exit module_is_live_exit(void) { ret = module_is_live(THIS_MODULE); //参数为当前模块 if( ret == 1 ) printk("in exit, state is:not GOING! \n"); else printk("in exit, state is:GOING\n"); printk("module exit ok! \n"); }
模块初始化及退出函数调用:
module_init(module_is_live_init); module_exit(module_is_live_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod module_is_live.ko插入模块,然后执行命令dmesg -c,会出现如图2-17所示的结果。
图2-17 插入module_is_live模块后系统输出信息
执行命令rmmod module_is_live.ko卸载模块,然后执行命令dmesg -c,会出现如图2-18所示的结果。
图2-18 卸载module_is_live模块后系统输出信息
结果分析:
在测试程序中,可以看到在模块初始化函数和模块退出函数中均调用了module_is_live( )函数,传入参数均为指向当前模块的指针THIS_MODULE。图2-17为模块加载时的运行结果,可以看到当前模块的状态为“not GOING”,即处于活动状态。图2-18为模块卸载时的运行结果,可以看到当前模块的状态为“GOING”,即处于非活动状态,这是因为模块正被卸载的缘故。下面是关于模块状态的说明。
表示模块状态的数据结构为枚举类型module_state,它在内核文件linux-3.19.3/include/linux/module.h中定义,详细信息参考f ind_module( )章节介绍。module_is_live( )函数判断模块是否处于live状态时,将模块的正在使用和正被加载状态视为活动状态,而将模块的正被卸载状态视为非活动状态。