Recibiendo SIGINT y controladores de excepción en Linux

Digamos que tenemos un programa en C que usa la función sleep ()

El programa se ejecuta y se va a dormir. Luego tecleamos ctrl-c para enviar una señal SIGINT al proceso.

Sabemos que la acción predeterminada al recibir un SIGINT es finalizar el proceso, también sabemos que la función sle, ep () reanuda el proceso cada vez que el proceso de suspensión recibe una señal.

Y mi libro de texto dice que para permitir que regrese la función sleep (), debemos instalar un controlador 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)
}

Aunque el código parece ser sencillo, todavía tengo preguntas si quiero profundizar más:

Background: cuando el proceso está inactivo y escribimos ctrl-c para enviar SIGINT

P1-Mi entendimiento es que Kernel envía SIGINT al proceso actualizando el bit pendiente correspondiente de SIGINT en el vector de bits pend, ¿es correcto mi entendimiento?

P2: el procesador detecta la existencia de SIGINT, pero dado que sobrescribimos el controlador para que regrese en lugar de finalizar el proceso, nuestro controlador se ejecuta y luego Kernel borra el bit pendiente correspondiente de SIGINT, ¿es correct

Q3- Dado que el bit pendiente correspondiente de SIGINT se borra, ¿cómo puede volver la función sleep ()? Creo que debería estar dormido todavía porque, en teoría, la función sleep () no tiene forma de conocer la existencia de SIGINT (se ha borrado)

Respuestas a la pregunta(3)

Su respuesta a la pregunta