Linux kernel 内核空间中的文件描述符

Linux kernel 内核空间中的文件描述符,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在为Linux开发一个charachter设备驱动程序 我想实现以文件描述符为目标的read()操作,该操作在每次打开设备时都有点特定 可以识别从中调用read()的进程(使用内核current宏),但在此进程中可能有多个文件描述符与我的设备关联 我知道在进行系统调用之前,文件描述符被映射到了struct file对象,但我能把它取回来吗?欢迎使用stackoverflow 要实现您在评论中指定的目标,有两种方法: ioctl和read: 在这里,您将有多个缓冲区供每个使用者读取,而写缓冲区

我正在为Linux开发一个charachter设备驱动程序

我想实现以文件描述符为目标的
read()
操作,该操作在每次打开设备时都有点特定

可以识别从中调用
read()
的进程(使用内核
current
宏),但在此进程中可能有多个文件描述符与我的设备关联


我知道在进行系统调用之前,文件描述符被映射到了
struct file
对象,但我能把它取回来吗?

欢迎使用stackoverflow

要实现您在评论中指定的目标,有两种方法:

  • ioctl
    read

    在这里,您将有多个缓冲区供每个使用者读取,而写缓冲区与读缓冲区不同。每个消费者在打开设备后会立即触发一个ioctl,这将导致分配新的缓冲区并为该缓冲区生成一个新的令牌(类似于此令牌numeber的意思是此缓冲区)。此令牌号应传回相关消费者

    现在,在进行读取调用之前,每个使用者都将触发ioctl,该ioctl给出令牌号,该令牌号将把当前读取缓冲区切换到与该令牌号关联的缓冲区

  • 现在这个方法添加了overhead,您还需要添加锁。同时,一次最多只能有一个消费者可以从设备中读取数据

  • ioctl
    mmap

    您可以为每个使用者映射读取缓冲区,并让它以自己的速度读取,使用ioctl请求新数据等

    这将允许多个使用者同时读取

  • 或者,您可以在每次打开调用时malloc一个新的数据缓冲区来读取,并将指向缓冲区的指针存储在文件结构的私有字段中。 当以这种方式调用read时,您可以只读取调用传递的文件结构的私有数据字段,并查看正在讨论的缓冲区。 还可以将包含缓冲区指针和大小等的整个结构嵌入到私有字段中


  • 您已经发布了一个。这是什么“每次打开设备时都有点特殊的操作”?我想创建一个输入设备,将输入数据存储在队列中。然后,打开我的设备的每个消费者都应该能够在没有并发或任何其他数据丢失的情况下读取每个输入块。输入驱动程序会实时向输入框架报告事件。无论如何,默认情况下输入设备(如用户空间所示)不是独占的。那么,你希望从当前的行为中得到什么改变?谢谢你的回答,但是我认为解决方案有点复杂。事实上我已经解决了我的问题。只需通过作为
    read
    参数提供的
    struct file*filp
    就可以识别消费者。所以我不需要ioctl我的设备,
    tail-f/dev/mysweetdev
    就可以了