这是我第一次在 linux 内核中实现驱动程序并遇到这个问题。
我正在尝试在我的角色驱动程序中实现“poll()”。 我调用了 poll_wait() 并传递了一个等待队列。
当从用户空间程序打开此驱动程序的设备文件并在此设备文件描述符 (fd) 上调用“poll”系统调用时,即使没有数据要发送给用户,poll 系统调用也会立即退出空间。
它不会等待偶数超时时间。
我无法弄清楚是什么导致了这个问题。
任何人都可以提出任何解决方案吗?
最佳答案
当有人在设备文件上调用 poll()
系统调用时,vfs 层会以这种方式处理它。
它会调用您驱动程序的轮询处理程序(以下称为 my_poll)。
- 如果不调用poll_wait,上层会直接返回mask而不分析其值。
- 如果您使用
poll_wait()
将您的驱动程序/调用进程添加到等待队列,那么调用进程将被添加到等待队列。
不要被 API 的名称 poll_wait()
所欺骗。它实际上并不等待或 sleep 。它只是将您的进程添加到接收事件通知的等待进程列表中。
从 poll_wait()
返回后,整个行为取决于返回的掩码。此掩码的值由 VFS 层使用。如果返回的掩码为零,它将使调用进程进入休眠状态。现在进程正在等待事件发生。
当有人唤醒这个等待队列时,所有等待的进程都会得到通知。 VFS 层再次调用 my_poll()
并检查掩码的返回值。
上述过程一直持续到 VFS 层收到一个非零掩码。
这意味着 my_poll() 将被多次调用。所以任何想要在他的设备驱动程序中实现轮询/读取的人,都应该在返回就绪掩码之前检查设备是否真的准备好进行读/写操作。
这里要注意的重要一点是,不要假设 poll_wait()
会休眠直到有人唤醒该队列。
关于c - 轮询立即从司机那里退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417886/