linux - 使用 Linux 字符设备驱动程序的 'write' 函数中的参数之一

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

我是一名学生,正在尝试学习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

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

最佳答案

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

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

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

有关详细信息,请参阅 https://lwn.net/images/pdf/LDD3/ch03.pdf 中的图 3-2

关于linux - 使用 Linux 字符设备驱动程序的 'write' 函数中的参数之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239464/

相关文章:

linux - bash 无法识别两位数

linux - Linux如何处理TSS结构中的I/O权限位图?

unix - 执行程序和终止程序时的信号和中断

c - 我应该在平台设备上的什么地方存储动态分配的内存(不使用全局变量)?

linux - 在 TI OMAP 3530 上插入适用于旧文件系统的 Linux 模块

linux - 对于给定数量的文件,如何显示最后几行中的几行?

c# - .NET C# 中的高性能 TCP Socket 编程

PHP-FPM (7.4.2) 没有正常停止?

linux - 内核会改变进程的 nice 值吗?

-lspci 命令的 C++ 模拟