Signale werden über den Typ sigset_t
manipuliert. Mehr Operationen für Signale Sets verfügbar sind:
- eine leere Menge S über
sigemptyset
schaffen, S = ∅
- ein Signal S über
sigaddset
, S = {s} S∪
- Entfernen zu einem Satz hinzuzufügen, S ein Signal s von einem Set über
sigdelset
, S = S \ {s}
- erstellen Sie die Menge aller möglichen Signale über
sigfillset
.
- Test ist ein Signal s ist in einem gegebenen Satz S über
sigismember
, s∈S?
Ein solcher Satz ist an verschiedenen Stellen verwendet: ein neues Verfahren Signalmaske einstellen, während Signalverarbeitung gesetzt zu blockieren, um den Satz von anstehenden Signale anfordert usw.
Wenn Sie verschiedene Signale fangen wollen, ist es may erscheint, dass einige Fangfunktionen nicht mit anderen unterbrochen werden dürfen. Sie können also eine Reihe von Signalen hinzufügen, die während der Übertragung eines bestimmten Signals blockiert werden sollen. Sie haben sich entschieden (wenn unkommentiert), SIGINT während der SIGALRM-Zustellung zu blockieren. Sie können dies nur beobachten, indem Sie während der Ausführung des Handlers ein SIGINT senden. was schwer zu realisieren ist.
Ein Beispiel, wo es wichtig sein kann?
Angenommen, der Handler von SIGUSR1 ändert eine gegebene Datenstruktur und der Handler für SIGUSR2 verwendet dieselbe Datenstruktur. Es ist sehr wichtig, dass beide Handler nicht gleichzeitig sind, einer kann nach dem anderen ausgeführt werden, aber Sie wollen wahrscheinlich nicht von einem während der Lieferung des anderen unterbrochen werden. Ihr Code ist self-concurrent, sagen, dass sogar im Falle von nur einem Thread, Signale können Sie zur Nebenläufigkeit führen.
haben Sie versucht, 'CTRL + C' zu drücken, wenn Sie Ihr Programm mit/ohne' sigaddset() 'ausführen? –
@SouravGhosh ja aber wie in anderen Antworten gezeigt, ich die Alarm-Handler läuft, um schnell zu bemerken, seine Wirkung. Hinzufügen eines 'sleep (10)' in Handler und ich kann den Unterschied sehen :) – NeDark