这是我在linux kernel&amp ;;中实现驱动程序的第一次经历。面对这个问题。
我正在尝试实施" poll()"在我的角色司机。 我打电话给poll_wait()&通过了等待队列。
当从用户空间程序打开该驱动程序的设备文件时叫"民意调查"系统调用此设备文件描述符(fd),即使没有数据要发送到用户空间,轮询系统调用也会立即退出。
它不会等待甚至超时时间。
我无法弄清楚导致此问题的原因。
有人可以建议任何解决方案吗?
答案 0 :(得分:3)
当有人在设备文件上调用poll()
系统调用时,vfs层会以这种方式处理它。
它调用你的驱动程序的poll处理程序(以下称为my_poll)。
poll_wait()
将驱动程序/调用进程添加到等待队列,则将调用进程添加到等待队列。不要被API的名称poll_wait()
欺骗。它实际上并没有等待或睡觉。它只是将您的进程添加到接收事件通知的等待进程列表中。
从poll_wait()
返回后,整个行为取决于返回的掩码。 VFS层使用此掩码的值。如果返回的掩码为零,它将使调用进程进入休眠状态。现在,该过程正在等待事件发生。
当有人唤醒此等待队列时,所有等待进程都会收到通知。 VFS层再次调用my_poll()
&检查掩码的返回值。
上述过程继续,直到VFS层接收到非零掩码。
这意味着my_poll()将被多次调用。因此,任何想要在其设备驱动程序中实现轮询/读取的人都应该在返回准备模板之前检查设备是否已准备好进行读/写操作。
这里需要注意的重要一点是,不要假设poll_wait()
会在有人唤醒该队列之前休眠。