Si se envían varias señales del mismo tipo y no se gestionan, no se ponen en cola. Di que el programa enmascara SIGUSR1
, llama al kill(getpid(), SIGUSR1)
10 veces y desenmascara SIGUSR1
. Recibirá SIGUSR1
solo una vez.
Lo que sucede es lo siguiente:
- Se recibe la primera señal, a saber, SIGUSR1, se llama al controlador y se está ejecutando
- Se recibió la segunda señal, ya que el controlador de nr1 aún se está ejecutando, la señal nr2 queda pendiente y bloqueada.
- Tercera señal recibida, ya que el controlador de nr1 aún se está ejecutando, la señal 3 se descarta.
- Se descartan las señales cuarta, quinta... etc. del mismo tipo que la señal nr1.
Una vez que el controlador de señales haya terminado con la señal nr1, procesará la señal nr2 y luego el controlador de señales procesará SIGUSR2.
Básicamente, las señales pendientes del mismo tipo no se ponen en cola, sino que se descartan. Y no, no hay una manera fácil de "ráfagas" de enviar señales de esa manera. Uno siempre asume que puede haber varias señales que se descartan, y trata de dejar que el manejador haga el trabajo de limpiar y averiguar qué hacer (como cosechar niños, si todos los niños mueren al mismo tiempo).