gpt4 book ai didi

Linux 设备驱动程序 - 如何在关闭文件时解除阻塞读取线程?

转载 作者:太空狗 更新时间:2023-10-29 12:19:39 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于Linux 设备驱动程序 - 如何在关闭文件时解除阻塞读取线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com