Сигнал не может разбудить процесс сна - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над проектом, который требует позаботиться о планировании процесса. Я пытался остановить определенный процесс, отправив сигнал 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.

Насколько я знаю, процесс обрабатывает сигнал следующими способами:

  1. выполнить действие по умолчанию для сигнала
  2. блокировка сигнала, установка маски сигнала (это делается с помощью системного вызова sigmask)
  3. назначить пользовательский обработчик сигналу, выполняя пользовательское действие (используя сигнал системного вызова)

Так что в этом случае я предполагал, что будет выполнено действие по умолчанию.

Я добавил 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...