我是一名正在尝试了解Linux角色设备驱动程序的学生。我一直在按照here编写的教程进行一些修改。读写系统调用此驱动程序只能在char缓冲区上读写。问题是,在我看来参数loff_t * off会改变它的值,而不应该这样做。我的意思是,如果你看到下一段代码。
static ssize_t my_write(struct file *f, const char __user *buf,
size_t len, loff_t *off){
int i;
char byte;
printk(KERN_INFO "Driver: write()\n");
printk(KERN_INFO "1. The value of *off is:%i\n",*off);
if (*off >= (BUFFER_SIZE - 1)){
return 0;
}
printk(KERN_INFO "2. The value of *off is:%i\n",*off);
if ((*off + len) > (BUFFER_SIZE - 1)){
len = BUFFER_SIZE - 1 - *off;
}
printk(KERN_INFO "3. The value of *off is:%i\n",*off);
for (i = 0; i < len; i++){
if (copy_from_user(&byte, buf + i, 1)){
return -EFAULT;
}
c[i]=byte;
}
printk(KERN_INFO "4. The value of *off is:%i\n",*off);
c[len]='\n';
*off += len;
printk(KERN_INFO "5. The value of *off is:%i\n",*off);
return len;
}
printk调用控制台的结果是:
答案 0 :(得分:0)
来自第3章:LDD中的字符驱动程序......
off
是指向“长偏移类型”对象的指针,该对象指示用户正在访问的文件位置。
无论方法传输的数据量是多少,它们通常都应该更新 文件位置在* offp以表示成功完成后的当前文件位置 系统调用。
有关更多信息,请参阅https://lwn.net/images/pdf/LDD3/ch03.pdf
中的图3-2