3

我正在尝试创建一个条目,/proc以便我可以控制我的内核模块。我想我得到了这个write部分,但我不知道这个read部分应该如何工作。

static char proc_data[1];

static ssize_t read_proc(struct file *file, char __user *buf, size_t count, loff_t *pos){
    int ret;
    if(pos > 0){
        ret = 0;
    }else{
        memcpy(buf, proc_data, 1);
        ret = 1;
    }
    return ret;
}

static ssize_t write_proc(struct file *file, const char __user *buf, size_t count, loff_t *pos){

    if(count > 2)
        return -EINVAL;

    if(copy_from_user(proc_data, buf, 1))
        return -EFAULT;

    if(strcmp("1", proc_data) == 0){
        //Do something
    }else if(strcmp("0", proc_data) == 0){
        //Undo something
    }

    return count;
}

如果我从 1 返回 1 read_proc,如果我在 中输入我的条目/proc,它不会停止输出相同的值。如果我返回 0,它不会输出任何东西。所以我猜我应该第一次返回 1,然后返回 0,但我不知道如何。

4

1 回答 1

3

.read.write回调中,通常需要loff_t *pos在返回之前更新。如果您的模块已读取或写入count字节,请*pos按该数量递增。

除此之外,请注意,当.read回调返回 0 时,它表示 EOF。如果它从不返回 0,则系统将无限循环地尝试在您读取文件时“将文件读到底” cat。这就是为什么第一次返回 1 然后返回 0 起作用的原因。

于 2013-07-29T11:25:38.163 回答