Linux设备驱动程序 – 如何在closures文件时取消阻止读取线程?

我正在尝试为Linux实现一个字符设备驱动程序,并遇到麻烦。 简而言之,写入设备的数据被缓冲以供读取。 当没有数据可用时,通过“wait_event_interruptible”读取块的调用。 由写入处理程序接收的数据调用“wake_up_interruptible”。 释放处理程序还调用“wake_up_interruptible”来解锁读取器,但设置一个标志来指示驱动程序正在释放。

从用户空间我有一个可执行文件,打开驱动程序通过“打开”,然后启动另一个线程。 主线程继续调用“读”。 按照预期,没有数据可用于读取和呼叫块。 另一个线程hibernate一秒钟(为主线程提供足够的时间来读取和阻塞),调用“closures”,然后再次调用“closures”。 第一个调用返回“0”,而第二个返回“-1”(如预期)。 然而,我的驱动程序的释放处理程序从来没有被调用,我不明白如何解锁我的阅读线程,而不明确发送信号或写入一些数据到设备。 我的理解是,当驱动程序的最后一个句柄closures,其释放处理程序被调用。 我试图实现我认为是标准的用户空间行为 – 阻止从文件读取的线程将变得畅通无阻,并在asynchronousclosures时接收文件结束返回值。

我是否对用户空间中的文件级读取/closures有正确的理解? 我有正确的设备驱动程序了解吗? 我错过了别的吗? 我看了“Linux设备驱动程序第三版”,并不能完全find这个问题的答案。 我也search了谷歌,但似乎无法find答案。 你可以提供任何帮助表示赞赏。 我的内核版本是3.0.15。

不幸的是,读系统调用保持对文件本身的引用,而不是文件描述符。 所以关闭文件描述符不会中止读取。

在所有情况下,你必须注意解锁和关闭之间的比赛条件,你不希望线程(或另一个)重新进入之间的系统调用;)