linux - 计时器向添加它的进程发出信号并将其从可中断 sleep 中唤醒

标签 linux linux-kernel linux-device-driver

我正在学习 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/

相关文章:

linux - 使用 SocketCAN 发送一次性消息

linux - 子进程会发生什么?

linux - Linux内核3.3.4中的自定义系统调用

linux - 内核中线程特定的单调时钟源

c - Linux 内核 : Is it OK to leave a streaming DMA mapping open indefinitely?

linux - _SCRIPTS primary 中指定的 Shell 脚本未显示在 dist tarball 中

linux - BASH - 计算可执行文件的数量

c - 如何有效地使用双空指针

linux - 错误 : implicit declaration of function ‘create_proc_entry’