module_is_live函数功能描述:该函数的功能是判断模块mod是否处于活动状态。
module_is_live文件包含
#include <linux/module.h>
module_is_live函数定义
在内核源码中的位置:linux-3.19.3/include/linux/ module.h
函数定义格式:
static inline int module_is_live(struct module *mod)
module_is_live输入参数说明
mod
:模块结构体指针,结构体中包含模块的名称、状态、所属的模块链表等。关于结构体struct module的定义,请参见find_module()函数的分析。
module_is_live返回参数说明
该函数返回一个整型值,如果为1表示模块处于live(not going)状态;如果为0,则模块mod处于going状态。
module_is_live实例解析
编写测试文件: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,会出现如图A
所示的结果。
执行命令rmmod module_is_live.ko卸载模块,然后执行命令dmesg -c,会出现如图B
所示的结果。
结果分析:
在测试程序中,可以看到在模块初始化函数和模块退出函数中均调用了module_is_live()函数,传入参数均为指向当前模块的指针THIS_MODULE。图A
为模块加载时的运行结果,可以看到当前模块的状态为“not GOING”,即处于活动状态。图B
为模块卸载时的运行结果,可以看到当前模块的状态为“GOING”,即处于非活动状态,这是因为模块正被卸载的缘故。下面是关于模块状态的说明。
表示模块状态的数据结构为枚举类型module_state,它在内核文件linux-3.19.3/include/linux/module.h中定义,详细信息参考find_module()。module_is_live( )函数判断模块是否处于live状态时,将模块的正在使用和正被加载状态视为活动状态,而将模块的正被卸载状态视为非活动状态。