使用file_operations无法正常编写proc回调函数实现

时间:2014-07-31 02:08:18

标签: c linux-kernel kernel-module

我正在尝试在从用户空间写入proc文件时实现回调函数。我正在使用file_ops来指定回调。

struct msg_t {
    u32 length;
    u8 type;    
    u16 cmd;
    char[20] name;
    int number;
} msg_t

userspace.cpp

msg_t msg = {0};
// populate msg struct accordingly
fwrite(&msg, sizeof(msg), 1, stream);
fflush();

LKM.c

static ssize_t write_proc( struct file *filp, const char __user *buff, size_t len, loff_t *data){
msg_t *msg = NULL;
printk(KERN_ALERT "len: %zd\n", len);

msg = (msg_t *) kmalloc(sizeof(msg_t), GFP_KERNEL);
memset(msg, 0, sizeof(msg_t));
copy_from_user( msg, buff, sizeof(msg_t));

switch (msg->cmd)
    {
     //switch stuff
    }
kfree(msg);
return len;
}

static const struct file_operations fops = {
    .owner          = THIS_MODULE,
    .write          = write_proc,
};

static int __init o_init(void){
struct proc_dir_entry *proc_dir = proc_mkdir("app", NULL);
struct proc_dir_entry *proc_entry = proc_create("file", 0777, proc_dir, &fops);
}

所以上面的实现与proc文件系统回调的较早实现一起工作,即create_proc_read_entry。当我将msg结构从用户空间写入/proc/app/file时,似乎有一个循环而len等于20然后它倒计时直到0然后它从大小开始msg struct然后递减几次然后停止。

len: 20
len: 19
len: 18
.
.
len: sizeof(msg)
.
.

我很难掌握新的proc文件实现(使用file_ops),所以任何帮助都表示赞赏。谢谢!

0 个答案:

没有答案