2

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

从用户空间我有一个可执行文件,它通过“打开”打开驱动程序,然后启动另一个线程。主线程继续调用“读取”。正如预期的那样,没有数据可供读取和调用阻塞。另一个线程休眠一秒钟(为主线程提供足够的时间来读取和阻塞),调用'close',然后再次调用'close'。第一个调用返回“0”,而第二个调用返回“-1”(如预期的那样)。但是,我的驱动程序的释放处理程序从未被调用,我无法理解如何在不显式发送信号或将一些数据写入设备的情况下解除对读取线程的阻塞。我的理解是,当驱动程序的最后一个句柄关闭时,它的释放处理程序被调用。

我对用户空间文件级别的读取/关闭有正确的理解吗?我对设备驱动程序有正确的理解吗?我还缺少其他东西吗?我浏览了“Linux Device Drivers 3rd Edition”,并没有找到这个问题的答案。我也搜索了谷歌,但似乎也找不到答案。感谢您提供的任何帮助。我的内核版本是 3.0.15。

4

1 回答 1

2

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

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

于 2013-07-10T20:09:02.353 回答