Zu guter Letzt wollen wir noch ein kleines Programm schreiben, um die Signalapi ein bisschen
auszutesten.
An dieser Stelle wollen wir ein Programm schreiben, das nicht terminiert, wenn wir ein SIGINT
an den Prozess senden.
Ein SIGINT können wir über das Terminal, zum Beispiel über die Tastenkombination
Steuerung C schicken.
Zur Bewältigung der Aufgabe habe ich hier schon mal ein kleines Codeslide vorbereitet.
Dieses wollen wir nun so erweitern, dass wir das Signal SIGINT auffangen können.
Dazu schauen wir uns erstmal an, wie wir eine Signalbehandlung setzen können.
Ich öffne einmal die MAN-Page zu SIGACTION.
Hier sehen wir einmal die Signatur der Funktion SIGACTION.
Wie vorhin schon erzählt, erweitert sie einmal die Signalnummer als erstes Argument, gefolgt
von einer Struktur Struct SIGACTION, die beschreibt, was bei Auftreten des Signals zu machen ist.
In der hier aufgeführten Tabelle sehen wir auch die Strukturmitglieder der Struktur SIGACTION.
Was wir setzen müssen, ist einmal der SA-Händler und zwar auf etwas, das uns erlaubt das Signal
SIGINT zu ignorieren.
Die SA-MASK, die wir nutzen können, um weitere Signale während der Ausführung des Signalhändlers
zu blockieren und die SA-FLEX, mit denen wir gegebenenfalls weiteres Verhalten spezifizieren können.
Das Strukturmitglied SA-SIGACTION müssen wir an dieser Stelle nicht weiter beachten.
Dieses kann verwendet werden, wenn man eine weitergehende Signalbehandlung möchte.
Dabei sollte man beachten, dass sich der SA-Händler und die SA-SIGACTION gegenseitig ausschließen.
Für SP brauchen wir nur den SA-Händler.
Wie hier zum SA-Händler schon beschrieben steht, kann man ihm das Makro SIG IGNORE oder
SIG DEFAULT zuweisen.
Wir schauen uns einmal SIG IGNORE an.
Wir schauen uns mal an, was wir alles über SIG IGNORE herausfinden können.
Dazu öffne ich die Man-Patch zu den Signalen.
Hier steht beschrieben, was die einzelnen Makros bedeuten.
Und zwar eben, dass man mit SIG IGNORE ein Signal ignorieren kann.
Wenn ich weiter runterscrolle, bekomme ich eine Tabelle, in der die einzelnen Signale
aufgelistet sind.
Und zwar mit den Makros, die ich im C-Programm verwenden kann, anstelle der eigentlichen
Zahlen.
Hier sieht man auch die Standardaktion, die ausgeführt wird für das jeweilige Signal.
Im Falle von SIG INT ist die Standardaktion ein T, also wird der Prozess terminiert.
Nun versuchen wir, den Signalhändler für SIG INT auf IGNORE zu setzen, damit der Signal
ignoriert werden kann.
Dazu bauen wir uns zunächst einmal eine Struktur SIG ACTION auf.
Und den SA-Händler müssen wir, wie eben gelesen, auf SIG IGNORE setzen.
Bei den anderen Feldern können wir andere Dinge setzen.
Zum Beispiel können wir die SA-Flex setzen und dabei bestimmen, dass unterbrochenes System
Aufrufe erneut ausgeführt werden soll, indem wir an den Flex SA-Restart setzen.
Wollen wir hier mehrere Optionen setzen, müssen wir diese miteinander verodern.
In dem Fall, wenn wir nur eine setzen wollen, können wir entweder Null mit dem Wert SA-Restart
verodern oder nur SA-Restart setzen.
Alle Strukturmitglieder, die nicht explizit genannt werden, werden bei dieser Art der
Initialisierung automatisch auf den Wert Null gesetzt.
Das betrifft auch das Strukturmitglied SA-MASK.
An der Stelle wissen wir aber nicht, wie die Implementierung der Signalmaske aussieht.
Das bedeutet, wir wissen nicht, ob sie richtig initialisiert ist, wenn sie auf den Wert Null
Zugänglich über
Offener Zugang
Dauer
00:10:25 Min
Aufnahmedatum
2020-11-15
Hochgeladen am
2020-11-15 19:47:53
Sprache
de-DE