Linux内核API完全参考手册(第2版)
上QQ阅读APP看书,第一时间看更新

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状态时,将模块的正在使用和正被加载状态视为活动状态,而将模块的正被卸载状态视为非活动状态。