【发布时间】:2020-01-09 20:35:54
【问题描述】:
static ssize_t read(struct file *file, char *buff, size_t len, loff_t *offset)
{
printk(KERN_INFO "write\n");
return simple_read_from_buffer(buff, len, offset, ker_buff, SIZE);
}
static ssize_t write(struct file *file, const char *buff, size_t len, loff_t *offset)
{
printk(KERN_INFO "read\n");
printk(KERN_INFO "your offset is:%lu\n",(long)offset);
return simple_write_to_buffer(ker_buff, SIZE, offset, buff, len);
}
当我执行echo "hi" > /dev/device_name 时,我得到了输出:
read
your offset is 0 as output.`
为什么我得到 0?
在手册页中,它被称为用户的偏移位置。
谁能解释一下offset有什么用?
【问题讨论】:
-
您正在打印一个地址!尝试打印
*offset而不是(long)offset。 -
您是否希望
offset具有不同的价值? -
您真的打印的是
(long)offset而不是(long)*offset?如果是这样,offset指针似乎是NULL,但只有驱动程序的open文件处理程序调用stream_open()时才会出现这种情况。需要注意的是simple_read_from_buffer()和simple_write_to_buffer()无条件地取消引用offset指针,所以如果offset是NULL则会导致内核Oops。
标签: c linux-device-driver