使用'写'中的一个参数Linux字符设备驱动程序的功能

时间:2014-04-23 08:58:47

标签: linux linux-kernel linux-device-driver kernel-module

我是一名正在尝试了解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调用控制台的结果是:

  1. * off的值为:0
  2. * off的值为:-1
  3. * off的值为:0
  4. * off的值为:693260
  5. * off的值为:-2132049164
  6. 你可以告诉我为什么吗?谢谢。

1 个答案:

答案 0 :(得分:0)

来自第3章:LDD中的字符驱动程序......

off是指向“长偏移类型”对象的指针,该对象指示用户正在访问的文件位置。

无论方法传输的数据量是多少,它们通常都应该更新 文件位置在* offp以表示成功完成后的当前文件位置 系统调用。

有关更多信息,请参阅https://lwn.net/images/pdf/LDD3/ch03.pdf

中的图3-2