民意调查立即从司机那里退出

时间:2014-08-21 03:42:28

标签: c linux-kernel linux-device-driver

这是我在linux kernel&amp ;;中实现驱动程序的第一次经历。面对这个问题。

我正在尝试实施" poll()"在我的角色司机。   我打电话给poll_wait()&通过了等待队列。

当从用户空间程序打开该驱动程序的设备文件时叫"民意调查"系统调用此设备文件描述符(fd),即使没有数据要发送到用户空间,轮询系统调用也会立即退出。

它不会等待甚至超时时间。

我无法弄清楚导致此问题的原因。

有人可以建议任何解决方案吗?

1 个答案:

答案 0 :(得分:3)

当有人在设备文件上调用poll()系统调用时,vfs层会以这种方式处理它。

它调用你的驱动程序的poll处理程序(以下称为my_poll)。

  1. 如果你不调用poll_wait,那么上层将只返回掩码而不分析它的值。
  2. 如果使用poll_wait()将驱动程序/调用进程添加到等待队列,则将调用进程添加到等待队列。
  3. 不要被API的名称poll_wait()欺骗。它实际上并没有等待或睡觉。它只是将您的进程添加到接收事件通知的等待进程列表中。

    poll_wait()返回后,整个行为取决于返回的掩码。 VFS层使用此掩码的值。如果返回的掩码为零,它将使调用进程进入休眠状态。现在,该过程正在等待事件发生。

    当有人唤醒此等待队列时,所有等待进程都会收到通知。 VFS层再次调用my_poll()&检查掩码的返回值。

    上述过程继续,直到VFS层接收到非零掩码。 这意味着my_poll()将被多次调用。因此,任何想要在其设备驱动程序中实现轮询/读取的人都应该在返回准备模板之前检查设备是否已准备好进行读/写操作。 这里需要注意的重要一点是,不要假设poll_wait()会在有人唤醒该队列之前休眠。