State facendo 2 cose qui:
compilazione di un sigset_t
. Un sigset_t è solo una raccolta di valori per i segnali e viene utilizzato in varie chiamate di sistema. È possibile:
- Crea un sigset_t vuota (sigemptyset()
- Aggiungi un segnale al set (sigaddset())
- Rimuovere un segnale al set (sigdelset())
- etc. ..
Impostazione della maschera di segnale per il gestore di segnale.Lo fai manipolando il membro quando si imposta un gestore di segnale con una chiamata a sigaction().
La maschera di un gestore di segnale segnale significa che mentre il gestore di segnale è in esecuzione, i segnali che si trovano nella maschera sarà bloccato - cioè tali segnali non verranno trattati purché siano bloccate. Quando il gestore del segnale è finito, i segnali in saranno sbloccati. Un segnale che è bloccato non è "perso", sarà gestito quando quel particolare segnale è sbloccato di nuovo.
Il sigaddset(&act.sa_mask, SIGINT);
indica che il segnale SIGINT non può verificarsi mentre è in esecuzione il codice per il gestore SIGALRM
.
D'altra parte, se si commenta sigaddset(&act.sa_mask, SIGINT);
, si rimane solo una lista vuota di segnali creati con sigemptyset(&act.sa_mask);
. Quindi, qualsiasi segnale che si verifica mentre la funzione del gestore SIGALRM è in esecuzione potrebbe prevenire quel gestore ed eseguire il gestore di segnale per quell'altro segnale.
Per un SIGINT, normalmente non si notano differenze con i test manuali: è improbabile che si riesca a premere CTRL-C esattamente quando il gestore di SIGALRM è in esecuzione e il gestore SIGALRM probabilmente esegue abbastanza rapidamente da non notare se il SIGINT è stato leggermente ritardato.
hai provato a premere 'CTRL + C' quando esegui il tuo programma con/senza commentare' sigaddset() '? –
@SouravGhosh yes ma, come indicato in altre risposte, il gestore degli allarmi si attiva rapidamente per notarne l'effetto. Aggiunta di un 'sleep (10)' nel gestore e posso vedere la differenza :) – NeDark