我正在为Linux开发一个charachter设备驱动程序。
我想实现以文件描述符为目标的read()
操作,每次打开设备时都会具体说明。
可以(使用内核read()
宏)识别从current
调用的过程,但是在此过程中可能有多个与我的设备关联的文件描述符。
我知道在进行系统调用之前文件描述符已映射到struct file
对象,但是我可以找回它吗?
答案 0 :(得分:0)
欢迎使用stackoverflow!
要实现您在注释中指定的目标,有两种方法:
ioctl
和read
:
在这里您将为每个使用者读取多个缓冲区,并且写入缓冲区与读取缓冲区不同。每个消费者在打开设备后立即将触发一个ioctl,这将导致分配新的缓冲区并为该缓冲区生成一个新的令牌(类似于此令牌数字表示此缓冲区)。该令牌号应回传给相关消费者。
现在,每个使用方在进行读取调用之前都会触发ioctl,该ioctl将给出令牌号,该令牌号会将当前的读取缓冲区切换为与该令牌号相关联的缓冲区。
现在,此方法会增加开销,您也需要添加锁。一次最多只能有一个消费者可以读取该设备。
ioctl
和mmap
:
您可以映射每个使用者的读取缓冲区,并使用ioctl来请求新数据等,使其按自己的步调从中读取。
这将允许多个使用者同时阅读。
或者,您可以m分配一个新的数据缓冲区以在每次打开调用时从中读取,并将指向缓冲区的指针存储在文件结构的私有字段中。 无论何时以这种方式调用读取,您都可以读取随调用传递的文件结构的私有数据字段,并查看正在讨论哪个缓冲区。 您也可以在私有字段中嵌入包含缓冲区指针和大小等的整个结构。