[英]Error: “device or resource busy” in removing proc module
I wrote a linux module to creat a proc file and write and read the data from it. 我编写了一个linux模块来创建proc文件,并从中写入和读取数据。 But I am unable to remove the module, its showing an error unable to remove saying "device or resource busy. here is my code.
但是我无法删除该模块,它显示了一个无法删除的错误,提示“设备或资源繁忙。这是我的代码。
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h> /*this is the file structure, file open read close */
#include<linux/cdev.h> /* this is for character device, makes cdev avilable*/
#include<linux/semaphore.h> /* this is for the semaphore*/
#include<linux/uaccess.h> /*this is for copy_user vice vers*/
#include<linux/proc_fs.h>
#define MAX_LEN 1024
int read_info(char *page, char **start, off_t off, int count, int *eof, void *data);
int write_info(struct file *filp, const char __user *buffer, unsigned long length, void *data);
static struct proc_dir_entry *proc_entry;
static char *info;
static int write_index;
static int read_index;
int write_info(struct file *filp, const char __user *buffer, unsigned long length, void *data) {
int capacity = (MAX_LEN - write_index) +1;
if(length > capacity) {
printk(KERN_INFO "NO sapce to write into peoc file \n");
return -1;
}
if(copy_from_user(&info[write_index], buffer, length))
return -2;
write_index += length;
printk(KERN_INFO " megharaj proc writing succesful, %d write \n", length);
return length;
}
int read_info(char *page, char **start, off_t off, int count, int *eof, void *data) {
int len;
len = sprintf(page, "%s\n", &info[read_index]);
read_index += len;
printk(KERN_INFO " megharaj proc reading succesful, %d read \n", len);
return len;
}
int init_module(void)
{
int ret = 0;
info = (char *)vmalloc(MAX_LEN);
memset(info, 0 , MAX_LEN);
/*truct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
struct proc_dir_entry *parent);*/
proc_entry = create_proc_entry("megharaj_proc", 0666, NULL);
if(proc_entry == NULL) {
ret = -1;
vfree(info);
printk(KERN_INFO " megharaj proc not created \n");
}
else {
write_index = 0;
read_index = 0;
proc_entry->read_proc = read_info;
proc_entry->write_proc = write_info;
printk(KERN_INFO " megharaj proc created \n");
}
return ret;
}
void clean_module(void)
{
vfree(info);
remove_proc_entry("megharaj_proc", NULL);
}
also attaching the makefile, 还附加了makefile,
obj-m := proc.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
echo and cat on proc file are working. proc文件上的echo和cat正在工作。 Once work is done i am not able to remove the module by using sudo rmmod proc
一旦完成工作,我将无法使用sudo rmmod proc删除模块
output from lsmod shows lsmod的输出显示
proc 12518 0 [permanent]
Now another question, what is this permanent ? 现在再问一个问题,这个永久物是什么? Is this the problem.
这是问题。 ?
?
Either name the module cleanup function cleanup_module (and not clean_module) or specifically declare it as a cleanup function (much better) like so: 可以将模块清理函数命名为cleanup_module(而不是clean_module),或者专门将其声明为清理函数(更好),如下所示:
module_init(init_module);
module_exit(clean_module);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.