Linux kernel Linux设备驱动程序中的open方法是否应返回文件描述符?

Linux kernel Linux设备驱动程序中的open方法是否应返回文件描述符?,linux-kernel,linux-device-driver,system-calls,Linux Kernel,Linux Device Driver,System Calls,我正在学习Linux设备驱动程序编程第3版,我对开放方法有一些疑问,这是那本书中使用的“scull_开放”方法: int scull_open(struct inode *inode, struct file *filp){ struct scull_dev *dev; /* device information */ dev = container_of(inode->i_cdev, struct scull_dev, cdev); filp->priva

我正在学习Linux设备驱动程序编程第3版,我对开放方法有一些疑问,这是那本书中使用的“scull_开放”方法:

int scull_open(struct inode *inode, struct file *filp){
    struct scull_dev *dev; /* device information */

    dev = container_of(inode->i_cdev, struct scull_dev, cdev);
    filp->private_data = dev; /* for other methods */
    /* now trim to 0 the length of the device if open was write-only */
    if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) {
            if (down_interruptible(&dev->sem))
                    return -ERESTARTSYS;
            scull_trim(dev); /* ignore errors */
            up(&dev->sem);
    }
    return 0;          /* success */
}
我的问题是:

  • 这个函数不应该向刚刚打开的设备返回一个文件描述符吗
  • 这个函数的“*filp”不是本地的吗?那么为什么我们要将dev的内容复制到它呢
  • 我们以后如何使用读写方法
  • 有人能给我写一个开放方法的典型“非脂肪”实现吗

    ssize\u t scull\u read(结构文件*filp,字符用户*buf,大小计数,loff\u t*f\u pos){ struct scul_dev*dev=filp->private_data; …}

用户空间打开函数就是您所想到的,这是一个返回文件描述符int的系统调用。有很多很好的参考资料,比如3.3

设备驱动程序“打开方法”是文件操作结构中的一个函数。它不同于用户空间“文件打开”。安装了设备驱动程序后,当用户代码打开设备时(例如访问/dev/scull0),就会调用此“打开方法”

  • 这个函数不应该向刚刚打开的设备返回一个文件描述符吗? 在linux设备驱动程序中,open()返回0或负错误代码。文件描述符由内核内部管理
  • 这个函数的“*filp”不是本地的吗?那么为什么我们要将dev的内容复制到它呢? filp表示打开的文件,内核将指向该文件的指针传递给驱动程序。有时使用此filp,有时驾驶员不需要它。需要复制dev的内容,以便在调用其他函数(比如read()时)时,驱动程序可以检索某些特定于设备的数据
  • 我们以后如何使用读写方法? 在read/write()中使用filp最常用的方法之一是获取锁。当设备打开时,驱动程序将创建一个锁。现在,当读/写发生时,将使用相同的锁来防止多个进程访问同一设备时数据缓冲区损坏
  • 有人能给我写一个开放方法的典型“非脂肪”实现吗? 由于您正在学习,请享受更多的探索。可以找到一个实现

  • 我当然知道开放的用户空间。当用户空间打开调用内核时,您是否有任何资源或链接可以确切地了解发生了什么?。我猜你提到的那本书只涉及开放的用户空间。