我正在尝试为Linux实现一个字符设备驱动程序,但遇到了问题。简而言之,写入设备的数据被缓冲以供读取。当没有可用的数据时,通过'wait_event_interruptible‘调用读取阻塞。写处理程序收到的数据调用'wake_up_interruptible‘。释放处理程序还调用'wake_up_interruptible‘来解除对读取器的阻塞,但会设置一个标志来指示驱动程序正在释放。
在用户空间,我有一个可执行文件,它通过“open”打开驱动程序,然后启动另一个线程。主线程继续调用“read”。正如预期的那样,没有数据可供读取,因此调用阻塞。另一个线程休眠一秒(为主线程提供足够的读取和阻塞时间),调用“close”,然后再次调用“close”。第一个调用返回'0‘,而第二个调用返回'-1’(不出所料)。然而,我的驱动程序的释放处理程序从来不会被调用,如果不显式地向设备发送信号或写入一些数据,我就无法理解如何解除读线程的阻塞。我的理解是,当驱动程序的最后一个句柄关闭时,它的释放处理程序就会被调用。我正在尝试实现我认为是标准用户空间行为的东西--一个被阻塞的线程从文件中读取数据时将变为非阻塞的,并在异步关闭时接收到一个文件结束返回值。
我是否对用户空间中文件级的读取/关闭有正确的理解?我是否对设备驱动程序有正确的理解?我还漏掉了什么吗?我翻阅了“Linux设备驱动程序第三版”,但找不到这个问题的答案。我也在谷歌上搜索过,但似乎也找不到答案。如果您能提供任何帮助,我们将不胜感激。我的内核版本是3.0.15。
发布于 2013-07-11 04:09:02
不幸的是,读syscall保留了对文件本身的引用,而不是文件描述符。因此,关闭文件描述符将不会中止读取。
在所有情况下,您都必须注意解除阻塞和关闭之间的竞态条件,您不希望线程(或另一个线程)重新进入其间的syscall ;)
https://stackoverflow.com/questions/13726970
复制相似问题