驱动中如何忽略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
相关产品推荐
相关产品推荐

