Recebendo SIGINT e manipuladores de exceção no Linux

Digamos que temos um programa em C que usa a função sleep ()

O programa é executado e entra no modo de suspensão. Então digitamos ctrl-c para enviar um sinal SIGINT ao process

Sabemos que a ação padrão após o recebimento de um SIGINT é finalizar o processo, também sabemos que a função sle, ep () retoma o processo sempre que o processo adormecido recebe um sina

E meu livro diz que, para permitir o retorno da função sleep (), precisamos instalar um manipulador SIGINT como este:

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)
}

Althouth o código parece ser direto, ainda tenho dúvidas se quero aprofundar:

Background: Quando o processo está inativo e digitamos ctrl-c para enviar SIGINT

Q1-Meu entendimento é que o Kernel envia o SIGINT ao processo, atualizando o bit pendente correspondente do SIGINT no vetor pend bit, meu entendimento está correto?

Q2-O processador detecta a existência do SIGINT, mas como substituímos o manipulador para fazê-lo retornar em vez de encerrar o processo, nosso manipulador é executado e, em seguida, o Kernel limpa o bit pendente correspondente do SIGINT, meu entendimento está correto?

Q3- Uma vez que o bit pendente correspondente do SIGINT é limpo, então como a função sleep () recebe retorno? Eu acho que deveria estar dormindo ainda porque, em teoria, a função sleep () não tem como saber a existência de SIGINT (foi limpa)

questionAnswers(3)

yourAnswerToTheQuestion