8 - 2.3 IPC + Signale: Signal-API von UNIX [ID:23869]
50 von 134 angezeigt

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

Teil einer Videoserie :

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

Einbetten
Wordpress FAU Plugin
iFrame
Teilen