You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

驱动中如何忽略pending信号以正常执行wait queue直至任务完成?

内核驱动等待队列与信号处理问题

驱动收到信号后需要通过等待队列完成部分任务,但测试发现收到SIGINT等信号后,调度器会立即返回,若发生在循环中系统会出现类挂起状态。是否存在类似clear_signal_pending的机制,能让等待队列正常工作直至驱动完成任务并返回对应错误码?

补充说明:我并非要接收信号,而是要防止因signal_pending导致schedule()被立即唤醒。若上述问题属于XY问题,换一种问法:

add_wait_queue(&idev->wait, &wait);
do
{
    set_current_state(TASK_INTERRUPTIBLE);
    schedule();
    // do something and break on specific condition
}
while(true);

无pending信号时上述代码正常工作,当其他模块(中断处理程序、定时器回调等)调用wake_up_interruptible时会回到“do something”逻辑。但用户在用户态按下^C后,SIGINT传递到驱动层,signal_pending()变为真,schedule()每次被调用都会立即唤醒,导致CPU陷入近乎死循环,无法处理其他系统请求,直到循环被打破。

如何在驱动层告知操作系统暂忽略已接收的信号,让schedule()正常执行,直至驱动决定处理该信号(如向用户态调用者返回-EINTR)?


更新:感谢Ian Abbott的建议,我最终选择了另一种方案:创建控制硬件的专用线程,在模块卸载时终止。这样用户态内核调用收到信号时可立即终止等待,而线程会继续运行直至事务逻辑结束。

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:34:57