我正在尝试使用/ proc文件输入工具在Linux内核模块中读取/写入变量。内核模块编译成功,但是尝试通过
编写echo 1 > My_file
此操作未完成。
而且,dmesg控制台不断充斥一些随机值。
[ 1171.481231] proc_write_flag New_Flag 1124646486
[ 1171.481245] proc_write_flag New_Flag 1124646486
[ 1171.481259] proc_write_flag New_Flag 1124646486
[ 1171.481271] proc_write_flag New_Flag 1124646486
[ 1171.481473] ^C
我是linux设备驱动程序的新手,正在尝试使用linux内核提供的/proc
工具。我尝试删除此内核模块,但是再次,操作未完成。
什么原因导致了这种行为,我该如何纠正?
这里是代码:
int my_flag;
static struct proc_dir_entry *pdir = NULL;
MODULE_LICENSE("GPL");
MODULE_AUTHOR("GPL");
static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count, loff_t *offset);
static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset);
static struct file_operations myops =
{
.owner = THIS_MODULE,
.read = proc_read_flag,
.write= proc_write_flag,
};
//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count,loff_t *offset)
{
int len=0;
printk("%s Flag %d\n",__FUNCTION__,my_flag);
//len = sprintf(,"%d\n",my_flag);
return len;
}
//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset)
{
int len= 0, value= 0, i=0, ret = 0;
char buf[WRITE_BUF_SIZE] ;
printk("%s Cur_Flag %d\n",__FUNCTION__,my_flag);
if( copy_from_user(buf,ubuf,1) ){
return -EFAULT;
}
my_flag = (int)buf;
printk("%s New_Flag %d\n",__FUNCTION__,my_flag);
return ret;
}
int init_module(void)
{
struct proc_dir_entry *pfile = NULL;
pdir = proc_mkdir("My_dir",NULL);
if(!pdir){
return -ENOMEM;
}
pfile = proc_create("My_file", 0666, pdir, &myops);
if(!pfile)
return -ENOMEM;
printk("Proc_entry Created Successfully, Module initialized\n");
return 0;
}
void cleanup_function(void)
{
remove_proc_entry("My_file", pdir);
remove_proc_entry("My_dir", NULL);
printk("Removing Proc_entry!!!");
}
写入功能应返回您处理的字节数。
在您的情况下,'proc_write_flag'函数返回的'ret'为0。这意味着它将被重复调用,直到您处理'ubuf'中的'count'个字节为止。
同样,'proc_read_flag'应该返回您写入'data'的字节数。您的情况是返回0(len)
'proc_write_flag'函数中还有其他问题。
'buf'数组未初始化,并且将'buf'(地址)强制转换为int不会给您预期的答案。
以此http://tuxthink.blogspot.com/2013/12/creating-directory-under-proc-in-kernel.html开头
然后查看kstrtol()函数。