Linux kernel 内核空间中的文件描述符
我正在为Linux开发一个charachter设备驱动程序 我想实现以文件描述符为目标的Linux kernel 内核空间中的文件描述符,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在为Linux开发一个charachter设备驱动程序 我想实现以文件描述符为目标的read()操作,该操作在每次打开设备时都有点特定 可以识别从中调用read()的进程(使用内核current宏),但在此进程中可能有多个文件描述符与我的设备关联 我知道在进行系统调用之前,文件描述符被映射到了struct file对象,但我能把它取回来吗?欢迎使用stackoverflow 要实现您在评论中指定的目标,有两种方法: ioctl和read: 在这里,您将有多个缓冲区供每个使用者读取,而写缓冲区
read()
操作,该操作在每次打开设备时都有点特定
可以识别从中调用read()
的进程(使用内核current
宏),但在此进程中可能有多个文件描述符与我的设备关联
我知道在进行系统调用之前,文件描述符被映射到了
struct file
对象,但我能把它取回来吗?欢迎使用stackoverflow
要实现您在评论中指定的目标,有两种方法:
ioctl
和read
:
在这里,您将有多个缓冲区供每个使用者读取,而写缓冲区与读缓冲区不同。每个消费者在打开设备后会立即触发一个ioctl,这将导致分配新的缓冲区并为该缓冲区生成一个新的令牌(类似于此令牌numeber的意思是此缓冲区)。此令牌号应传回相关消费者
现在,在进行读取调用之前,每个使用者都将触发ioctl,该ioctl给出令牌号,该令牌号将把当前读取缓冲区切换到与该令牌号关联的缓冲区ioctl
和mmap
:
您可以为每个使用者映射读取缓冲区,并让它以自己的速度读取,使用ioctl请求新数据等
这将允许多个使用者同时读取您已经发布了一个。这是什么“每次打开设备时都有点特殊的操作”?我想创建一个输入设备,将输入数据存储在队列中。然后,打开我的设备的每个消费者都应该能够在没有并发或任何其他数据丢失的情况下读取每个输入块。输入驱动程序会实时向输入框架报告事件。无论如何,默认情况下输入设备(如用户空间所示)不是独占的。那么,你希望从当前的行为中得到什么改变?谢谢你的回答,但是我认为解决方案有点复杂。事实上我已经解决了我的问题。只需通过作为
read
参数提供的struct file*filp
就可以识别消费者。所以我不需要ioctl我的设备,tail-f/dev/mysweetdev
就可以了