我正在尝试为Linux实现一个字符设备驱动程序,但我遇到了麻烦。简而言之,写入设备的数据被缓冲以供读取。当没有数据可用时,通过'wait_event_interruptible'调用读取块。写处理程序接收的数据调用'wake_up_interruptible'。发布处理程序还调用'wake_up_interruptible'来解锁阅读器,但设置一个标志以指示驱动程序正在释放。
从用户空间我有一个可执行文件,通过'open'打开驱动程序,然后启动另一个线程。主线程继续调用'read'。按照预期,没有可用于读取和调用块的数据。另一个线程休眠一秒钟(为主线程提供足够的时间来读取和阻塞),调用'close'然后再次调用'close'。第一个调用返回'0',而第二个调用返回'-1'(如预期的那样)。但是,我的驱动程序的发布处理程序从未被调用,我无法理解如何在不明确地向设备发送信号或向设备写入数据的情况下解除阻塞我的读取线程。我的理解是,当驱动程序的最后一个句柄关闭时,它的释放处理程序被调用。我正在尝试实现我认为的标准用户空间行为 - 从文件中阻止读取的线程将被解除阻塞,并在异步关闭时接收文件结束返回值。
我是否正确理解了用户空间中文件级别的读取/关闭?我是否有正确的设备驱动程序理解?我错过了别的什么吗?我查看了“Linux设备驱动程序第3版”并且找不到这个问题的答案。我也搜索过谷歌,但似乎也无法找到答案。您可以提供的任何帮助表示赞赏。我的内核版本是3.0.15。
答案 0 :(得分:2)
不幸的是,read syscall保留了对文件本身的引用,而不是文件描述符。因此,关闭文件描述符不会中止读取。
在所有情况下,你必须注意解锁和关闭之间的比赛条件,你不希望线程(或另一个)重新进入系统调用之间;)