2012-02-01 3 views
0

Я написал модуль для чтения и записи из файла/proc. код показывают предупреждения, как комментируются и показано после кода code.The выглядит следующим образом:о функциях чтения и записи о/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 ', inlined from' proc_write 'по адресу /home/karan/practice/procf/testproc.c:33:18:

Когда я использую insmod, а затем echo hi>/dev/mytest и cat /dev/mytest его сообщения в функции записи и функции чтения соответственно в /var/log/messages. но на терминале нет выхода.

Выполнено на самом деле Я указывал функции чтения и записи функции чтения и записи file_operations вместо proc_dir_entry и не проверял количество.

+0

Перед тем, отформатируйте код с 'astyle' или' indent'. – Dave

+1

Когда вы компилируете предупреждения, в которых упоминаются номера строк, вы должны комментировать или иным образом показывать, какие строки их бросают. –

ответ

4

Ваши функции для 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); 

Они оба использованных в 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_tint - это не то же самое, что size_t (маловероятно, так как его подписали, а другого нет), тогда вы увидите проблемы, но у вашего read есть более серьезные проблемы - у вас есть char ** где он ожидает char *.

Компилятор был очень рад принять ваше слово, что это было то, что вы хотели сделать, но я не думаю, что это так.

read Это выглядит в struct proc_dir_entry больше как read_proc_t, но это не то, что вы устанавливаете в вашем dev_proc_ops.

(Как примечание стороны, я думаю, что вы, вероятно, хотите, чтобы сделать остальную часть ваших функций static также, так как они подвергаются воздействию с помощью указателей на функции)

Смежные вопросы