about / proc функции чтения и записи

Я написал модуль для чтения и записи из файла / 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, а затем echo hi>/dev/mytest и cat /dev/mytest, он передает сообщения в функции записи и функции чтения соответственно в /var/log/messages. но на терминале нет вывода.

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


person karan421    schedule 01.02.2012    source источник
comment
Перед публикацией отформатируйте код с помощью astyle или indent.   -  person Dave    schedule 01.02.2012
comment
Когда у вас есть предупреждения компиляции, в которых упоминаются номера строк, вы должны прокомментировать или иным образом показать, какие строки их выбрасывают.   -  person Dan Fego    schedule 01.02.2012


Ответы (1)


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

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

Этот read больше похож на read_proc_t в _ 17_, но это не то, что вы установка в вашем dev_proc_ops.

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

person Flexo    schedule 01.02.2012