Допустим, у нас есть программа на C, которая использует функцию sleep ()
Программа выполняется и переходит в спящий режим.Затем мы набираем ctrl-c для отправки сигнала SIGINT процессу.
Мы знаем, что действие по умолчанию при получении SIGINT - завершить процесс, мы также знаем, что функция sleep () возобновляет процессвсякий раз, когда процесс ожидания получает сигнал.
И в моем учебнике сказано, чтобы разрешить возврат функции 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
Q1-Я понимаю,Ядро отправляет SIGINT процессу, обновляя соответствующий ожидающий бит SIGINT в векторе битов ожидания, верно ли мое понимание?
Q2-Процессор обнаруживает существование SIGINT, но, поскольку мы перезаписываем обработчик, чтобы он возвращалсявместо того, чтобы завершить процесс, чтобы наш обработчик выполнялся, а затем ядро очищает ожидающий ответ SIGINT bверно, мое понимание верно?
Q3- Так как очищенный ожидающий бит SIGINT очищен, то как функция sleep () может получить возврат?Я думаю, что он должен быть в состоянии покоя, потому что теоретически функция sleep () не может узнать о существовании SIGINT (было очищено)