【发布时间】:2013-07-29 19:25:38
【问题描述】:
我正在尝试在/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;
}
如果我从 read_proc 返回 1,如果我在 /proc 中输入我的条目,它不会停止输出相同的值。如果我返回 0,它不会输出任何东西。所以我猜我应该第一次返回 1,然后返回 0,但我不知道如何。
【问题讨论】:
-
也许你应该打印从你的第一次和后续调用中收到的参数......也许特别是偏移参数。它们不是 0 / 非零,因为您的代码似乎已经解决了吗?
-
@mah 我想过,但我看不到它们之间的任何关系,因为计数是 65535 并且它是空的。
-
我希望您在所有情况下(无论调用者要求什么)都会收到相同的大小计数以提高块效率,并且随着来自同样打开。请记住,内核调用代价高昂,因此系统希望最大限度地减少它们,并将通过最大程度地减少调用次数的大缓冲区来实现。
标签: c linux-kernel kernel-module kernel