【问题标题】:Using one of the parameters in 'write' function for Linux Character Device Driver使用 Linux 字符设备驱动程序的“写入”函数中的参数之一
【发布时间】:2014-04-23 08:58:46
【问题描述】:

我是一名正在尝试学习 Linux 字符设备驱动程序的学生。我一直在关注编写here 并进行了一些修改的教程。此驱动程序的读取和写入系统调用仅在字符缓冲区上读取和写入。问题是,在我看来,参数 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

你能告诉我为什么吗?谢谢。

【问题讨论】:

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


【解决方案1】:

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

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

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

更多信息请参考https://lwn.net/images/pdf/LDD3/ch03.pdf中的图3-2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多