Я работаю над проектом, который требует позаботиться о планировании процесса. Я пытался остановить определенный процесс, отправив сигнал 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, сигнал SIGINT ничего не делает, даже если состояние процесса установлено на TASK_INTERRUPTIBLE
.
Насколько я знаю, процесс обрабатывает сигнал следующими способами:
- выполнить действие по умолчанию для сигнала
- блокировка сигнала, установка маски сигнала (это делается с помощью системного вызова 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.