对应module_put()函数详细用法分享。
第一:函数简介
//函数原型
void module_put(struct module * module)
//函数功能
该函数功能是将一个特定模块module的引用计数减一
这样当一个模块的引用计数不为0而不能被内核卸载的
时候,可以调用该函数一次或多次,实现模块计数清零
从而实现模块卸载
//输入参数说明
module:指向模块结构体的指针,结构体中包含模块名称,状态,所属模块等
第二:函数实例编写
//内核模块函数代码实现
#include <linux/module.h>
#include <linux/init.h>static int __init module_put_init(void)
{//待查找的模块名称const char *name = "hello1";//调用查找模块函数struct module *fmodule =find_module(name);//判断其中的返回值if(fmodule != NULL){//输出模块的调用次数printk("before calling module_put\n");//输出对应的调用次数printk("refs of %s is %d\n",name,module_refcount(fmodule));//释放对应的模块module_put(fmodule);printk("refs of %s is %d\n",name,module_refcount(fmodule));}else{printk("find %s is failed\n", name);}return 0;
}//退出函数
static void __exit module_put_exit(void)
{printk("module exit ok!\n");
}MODULE_LICENSE("GPL");
module_init(module_put_init);
module_exit(module_put_exit);
第三:案例实现效果
[ 1589.376537] before calling module_put
[ 1589.376580] refs of hello1 is 0
[ 1589.376597] refs of hello1 is -1
[ 1615.096618] module exit ok!
总结:该API函数,可以很好的将对应的模块调用次数进行减一操作,但是使用的过程中如果减到0了就可以卸载了,否则还会继续减成负数(无法卸载)