我正在从事一个需要照顾流程安排的项目。我试图通过发送SIGINT信号(ctrl + c)来停止某些进程,但是我发现睡眠进程不会唤醒。 我解决了这个奇怪的问题,但是找不到SIGINT信号为什么不能唤醒睡眠过程。
这是我的原始代码(进程卡住了):
set_current_state(TASK_INTERRUPTIBLE);
while (!item->assigned) {
schedule_timeout(2*HZ);
set_current_state(TASK_INTERRUPTIBLE);
}
set_current_state(TASK_RUNNING);
因此,在while循环内部,当!item->assigned
仍为1时,即使将进程的状态设置为TASK_INTERRUPTIBLE
,SIGINT信号也不执行任何操作。
据我所知,过程通过以下方式处理信号:
- 执行信号默认操作
- 阻止信号设置信号屏蔽(通过系统调用sigmask完成)
- 为信号分配自定义处理程序,执行自定义操作(使用系统调用信号)
所以在这种情况下,我假设它将执行默认操作。
我添加了signal_pending(current)
,以检查是否有任何未决信号,如果存在,则跳出循环,以便进程可以处理未决信号。
set_current_state(TASK_INTERRUPTIBLE);
while (!item->assigned) {
schedule_timeout(2*HZ);
if (signal_pending(current))
{
break;
}
set_current_state(TASK_INTERRUPTIBLE);
}
set_current_state(TASK_RUNNING);
但是仍然不知道为什么它没有捕获SIGINT信号。