Nachdem wir jetzt wissen, wie Signale ungefähr funktionieren, wollen wir uns mal anschauen,
wie wir mit Signalen unter Unix arbeiten können.
Das bedeutet, wie wir eine eigene Signalbehandlung implementieren können und wie wir anderen
Prozessen ein Signal senden können.
Zunächst einmal schauen wir uns an, wie wir die Signalbehandlung für ein Signal setzen
können.
Dafür gibt es den SIG-ACTION-Systemaufruf.
Dieser erwartet als erstes ein Integer, nämlich die Signalnummer.
Alle Signale, die im System vorhanden sind, werden durch Integer repräsentiert.
Für jedes Signal gibt es ein Makro, das die Signalnummer in etwas leichter verständliches,
also die Namen, abbildet.
Diese können hier verwendet werden.
Das zweite Argument, der Zeige auf die Struktur SIG-ACTION, beschreibt, wie für das jeweilige
Signal, das wir als erstes angeben, die Signalbehandlung aussehen soll.
Das dritte und letzte Argument ist ein Platzhalter auf eine Struktur SIG-ACTION.
Hier werden Informationen zur alten Signalbehandlung gespeichert, die durch die neue, das zweite
Argument ersetzt wird.
Ist man an der alten Signalbehandlung nicht interessiert, kann man hier auch einfach den
Wert Null übergeben.
Über den Rückgabewert der SIG-ACTION-Funktion können wir schauen, ob ein Fehler aufgetreten
ist oder ob das Setzen der Signalbehandlung erfolgreich war.
Setzt man das zweite Argument, Act, auf Null, so kann man die aktuell vorherrschende Signalbehandlung
abfragen, ohne sie zu verändern.
Dazu muss aber das dritte Argument auf einen gültigen Speicherbereich verweisen.
Als nächstes schauen wir uns die Struktur SIG-ACTION etwas genauer an.
Von der Struktur SIG-ACTION interessieren uns drei Strukturmitglieder besonders.
Zunächst einmal der SA-Händler.
Dies ist ein Funktionspointer, mit dem die Behandlungsroutine angegeben wird.
Wir können hier aus der Signatur lesen, dass der Funktionszeiger auf eine Funktion zeigt,
die ein Argument des Typ Integer erwartet.
Außerdem ist es eine Void-Funktion, das heißt sie hat keinen Rückgabewert.
Das Argument, das der Funktion übergeben wird, ist ein Integer, der die Signalnummer angibt.
Wir können hier auch vordefinierte Werte abspeichern.
Einmal gibt es das Makro SIG-IGNORE.
Wenn wir SA-Händler auf SIG-IGNORE setzen, sagen wir damit, dass das Signal ignoriert
werden soll.
Andernfalls können wir SIG-Default setzen.
Damit wird die Standard-Signalbehandlung gesetzt.
Wenn wir den Funktionszeiger SA-Händler auf eine eigene Funktion setzen, dann wird diese
Signalnummer angesprungen, sobald das Signal auftritt.
Wenn man den SA-Händler auf SIG-Default setzt, muss man noch beachten, dass dies für manche
Signale nicht die reine Standardbehandlung ist, da dies z.B. noch durch weitere Optionen
beeinflusst wird.
Im Falle von SIG-Child z.B. kann man mit SIG-Default und dem SA-Flag No Child Wait erzwingen, dass
Kindprozesse nicht mehr in den Zombiezustand übergehen.
Das nächste Strukturmitglied, das wir betrachten, ist SA-Mask.
Mit SA-Mask kann man das Auftreten bestimmter Signale verhindern bzw. verzögern.
Tatsächlich ist es nämlich so, dass auch die Signalbehandlung eines Signals durch das Zustand
eines weiteren Signals unterbrochen werden kann.
Möchte man dies nicht, so kann man in der SA-Mask explizit bestimmen, welche Signale
Zugänglich über
Offener Zugang
Dauer
00:08:59 Min
Aufnahmedatum
2020-11-15
Hochgeladen am
2020-11-15 19:39:11
Sprache
de-DE