我正在学习 Linux 设备驱动程序,尤其是计时器和等待队列。 我希望它们在单个字符驱动程序中一起工作,我可以使用 IO 控制命令让驱动程序进入休眠状态,同时我继续使用定时器在用户空间中获得 fasync 中断。 我注意到如果我使用
wait_event_interruptible();
然后当计时器到期时,驱动程序退出等待并返回代码 -512,即使条件尚未满足。但是如果我使用
wait_event();
那么问题就解决了。我读到 wake_up_event_interruptible() 如果中断唤醒进程,则返回非零返回码。
我的理解是正确的,计时器会中断添加它的进程(我在文本中找不到任何证据),因为根据我的理解,计时器函数变得独立于添加它的进程的状态。
最佳答案
来自 code for wait_event_interruptible :当当前内核进程的信号挂起时,函数 wake_up_event_interruptible()
返回 -ERESTARTSYS
(即 -512)。
内核计时器(通过 setup_timer
添加)独立于当前内核进程的状态中断其执行。更具体地说,来自here ,内核有三个队列:任务队列,tasklet(从内核 2.3.43 开始)和内核定时器。 (简单来说)当内核计时器到期时,CPU 会转到中断处理例程,该例程保存当前上下文并转到计时器注册的回调函数。处理中断后,调度程序决定让 CPU 运行哪个任务。
关于linux - 计时器向添加它的进程发出信号并将其从可中断 sleep 中唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50678173/