关于/ proc的读写function

我写了一个模块来从/ 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'中,从/ proc_write'/home/karan/practice/procf/testproc.c:33:18:

当我使用insmod,然后在/var/log/messages分别echo hi>/dev/mytestcat /dev/mytest分别在write函数和read函数中给出/var/log/messages 。 但terminal上没有输出。

实际上,我正在将读写函数指向file_operations的读写函数,而不是proc_dir_entry,而不是检查count。

proc_readproc_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); 

这些都在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看起来更像是struct proc_dir_entry read_proc_t ,但这不是你在dev_proc_ops设置的。

(作为一个方面说明,我想你可能想让其他的函数也是static ,因为它们通过函数指针暴露)