我已经编写了一个从/proc文件读写的模块。代码显示的警告已注释并显示在代码后面。代码如下:
#include<linux/module.h>
#include<linux/init.h>
#include<linux/proc_fs.h>
#include<asm/uaccess.h>
#define proc_fs_max 1024
#define proc_entry "my_test"
static struct proc_dir_entry *our_proc_file;
static char procfs_buffer[proc_fs_max];
static int proc_buffer_size = 0;
int proc_read(char *buffer,char **buffer_location,off_t offset,int buffer_length,int
*eof,void *data)
{
int ret;
printk(KERN_ALERT"\n in read function");
if(offset > 0){
ret = 0;
} else {
memcpy(buffer,procfs_buffer,proc_buffer_size);
ret = proc_buffer_size;
}
return ret;
}
int proc_write(struct file *file, const char *buffer, unsigned long count,void *data)
{
printk(KERN_ALERT"\nin write function\n");
proc_buffer_size = count;
if(proc_buffer_size > proc_fs_max)
proc_buffer_size = proc_fs_max;
if(copy_from_user(procfs_buffer,buffer,proc_buffer_size)) //showing comments on warning as below
return -EFAULT;
return proc_buffer_size;
}
int proc_open(struct inode *inode,struct file *filp)
{
try_module_get(THIS_MODULE);
return 0;
}
int proc_close(struct inode *inode,struct file *filp)
{
module_put(THIS_MODULE);
return 0;
}
static struct file_operations dev_proc_ops = {
.owner = THIS_MODULE,
.read = proc_read, //warning initialization from incompatible pointer type
.write = proc_write, //warning initialization from incompatible pointer type
.open = proc_open,
.release = proc_close,
};
static int dev_init(void)
{
our_proc_file = create_proc_entry(proc_entry,0644,NULL);
our_proc_file->proc_fops = &dev_proc_ops;
return 0;
}
static void dev_clean(void)
{
remove_proc_entry(proc_entry,NULL);
}
module_init(dev_init);
module_exit(dev_clean);
使用“复制到用户”时显示编译警告,如下所示:
在/usr/src/linux-2.6.34.10-0.6/arch/x86/include/asm/uaccess.h:571:0中包含的文件中,
发件人/home/karan/practice/procf/testproc.c:4:
在函数“copy_from_user”中,
内联自/home/karan/practice/procf/testproc.c:33:18的“proc_write”:
当我使用insmod,然后
echo hi>/dev/mytest
和cat /dev/mytest
时,它分别在/var/log/messages
中以写函数和读函数给出消息。但终端没有输出。实际上,我是把读写函数指向文件操作读写函数,而不是proc_dir_entry,并没有检查计数。
最佳答案
您的proc_read
和proc_write
函数与您使用它们的位置不匹配,正如编译器在警告中指出的那样。在您的struct file_operations
中,您有:
int proc_read(char *buffer,char **buffer_location,off_t offset,int buffer_length,int
*eof,void *data);
int proc_write(struct file *file, const char *buffer, unsigned long count,void *data);
这两种类型都在a
struct file_operations
中使用,但在include/linux/fs.h中,struct
中的函数指针类型是:ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
如果
int
与ssize_t
不一样,那么您将看到问题,但是您的int
有更严重的问题-您有一个size_t
需要一个read
。编译器很高兴接受你的话,这是你想做的,但我不认为它是。
这个
char **
看起来更像char *
中的read
,但这不是您在read_proc_t
中设置的。(顺便说一句,我认为您可能还希望使其余的函数
struct proc_dir_entry
也公开,因为它们是通过函数指针公开的)关于c - 关于/proc读写功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9101026/