我试图为Linux实现字符设备驱动程序,但遇到了麻烦。简而言之,写入设备的数据被缓冲以供读取。如果没有可用数据,则通过“wait_event_interruptible”调用读取块。写处理程序接收到的数据称为“wake_up_interruptible”。释放处理程序还调用“wake_up_interruptible”以解除对读取器的阻止,但设置一个标志以指示驱动程序正在释放。
在用户空间中,我有一个可执行文件,可通过“open”打开驱动程序,然后启动另一个线程。主线程继续调用“read”。按照预期,没有数据可用于读取和调用块。另一个线程睡眠一秒钟(为主线程提供了足够的时间来读取和阻塞),调用“关闭”,然后再次调用“关闭”。第一次调用返回“0”,第二个调用返回“-1”(符合预期)。但是,从不调用驱动程序的释放处理程序,并且在不显式发送信号或将某些数据写入设备的情况下,我无法理解如何解除阻塞读取线程。我的理解是,当驱动程序的最后一个句柄关闭时,将调用其释放处理程序。我正在尝试实现我认为是标准的用户空间行为-阻止从文件读取的线程将被取消阻止,并在异步关闭时接收文件结束返回值。
我是否对用户空间中文件级别的读取/关闭有正确的了解?我对设备驱动程序的理解正确吗?我还想念其他东西吗?我浏览了“Linux设备驱动程序第三版”,但找不到这个问题的答案。我也搜索了Google,但似乎也找不到答案。您可以提供的任何帮助都将受到赞赏。我的内核版本是3.0.15。
最佳答案
不幸的是,读取的syscall保留了对文件本身而不是文件描述符的引用。因此,关闭文件描述符不会中止读取。
在所有情况下,您都必须注意解除阻塞和关闭之间的竞争状况,您不希望线程(或另一个线程)在;)之间重新进入syscall。