Код для диспетчера сигналов ядра выглядит примерно так: 1) Проверьте, не пойман ли сигнал. 2) Если это так, организуйте вызов обработчика. 3) Вернуться в пользовательское пространство. (затем пользовательское пространство делает вещи и возвращается в пространство ядра) 4) Решите, следует ли возобновить системный вызов или нет. Это вызов функции. Userspace выполняет шаги 7-9, 10 переходов обратно в ядро.

тим, у нас есть программа на C, которая использует функцию sleep ()

Программа выполняется и идет спать. Затем мы набираем ctrl-c для отправки сигнала SIGINT процессу.

Мы знаем, что действие по умолчанию при получении SIGINT - завершить процесс, мы также знаем, что функция sle, ep () возобновляет процесс всякий раз, когда спящий процесс получает сигнал.

И мой учебник говорит, что для того, чтобы функция sleep () могла вернуться, мы должны установить обработчик SIGINT следующим образом:

void handler(int sig){
    return; /* Catch the signal and return */
}
...
int main(int argc, char **argv) {
   ...
   if (signal(SIGINT, handler) == SIG_ERR) /* Install SIGINT handler */
      unix_error("signal error\n");
   ...
   sleep(1000)
}

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

Справочная информация: когда процесс находится в спящем режиме, и мы нажимаем ctrl-c, чтобы отправить SIGINT

В1-Мое понимание состоит в том, что Ядро отправляет SIGINT процессу, обновляя соответствующий ожидающий бит SIGINT в векторе ожидающих бит, правильно ли мое понимание?

Q2-Процессор обнаруживает существование SIGINT, но, поскольку мы перезаписываем обработчик, чтобы он возвращал вместо завершения процесса, чтобы наш обработчик выполнялся, а затем ядро ​​очищает ожидающий бит SIGINT в ожидании, верно ли мое понимание?

Q3- Так как очищенный ожидающий бит SIGINT очищен, то как функция sleep () может получить возврат? Я думаю, что он должен быть в состоянии покоя, потому что в теории функция sleep () не может узнать о существовании SIGINT (было очищено)