您好我是内核空间编程的新手,我开始学习proc文件系统。
我写了一个模块,在注册时创建一个proc文件
我取消注册该模块时将其删除。 但是,如果我不使用remove_proc_entry()删除该文件并取消注册我的模块,那么系统会在一段时间后挂起
为什么会这样?
代码是
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/proc_fs.h>
#include<linux/module.h>
#include<linux/fs.h>
int myopen(struct inode *, struct file *);
ssize_t myread(struct file *, char __user *, size_t, loff_t *);
int myopen(struct inode *p, struct file *q)
{
printk(KERN_ALERT "I am in myopen\n");
return 0;
}
ssize_t myread(struct file *p, char __user *q, size_t r, loff_t *s)
{
printk(KERN_ALERT "I am in myread\n");
return 0;
}
static const struct file_operations fs={
.open=myopen,
.read=myread
};
int start(void)
{
proc_create("myprocfile", 0, NULL, &fs);
return 0;
}
void stop(void)
{
//remove_proc_entry("myprocfile", NULL);
/*
If I uncomment the above line
then everything works fine
*/
}
module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");
答案 0 :(得分:1)
访问文件时,会读取file_operations
结构,并且进一步的操作取决于存储在此结构中的指针。
如果您在退出模块时没有删除文件,文件仍然可以访问。但 file_operations
结构与之相关联,已被释放。因此,在模块卸载后对文件的任何访问都会导致读取已释放的数据。访问内存时发生此触发错误。
这就是内核模块删除它之前创建的所有对象的关键所在。