Unix / Linux - Signals and Traps
Hallo da, zukünftige Computer-Zauberer! Heute tauchen wir ein in die faszinierende Welt der Unix/Linux-Signale und -Fallen. Keine Sorge, wenn du neu im Programmieren bist - ich werde dich auf diesem Abenteuer Schritt für Schritt führen, genau wie ich es in den letzten Jahren für unzählige Schüler getan habe. Also, lassen Sie uns gemeinsam auf diese aufregende Reise gehen!
Was sind Signale?
Stell dir vor, du bist in einer beschäftigten Restaurantküche. Der Küchenchef (nennen wir ihn Chef Unix) muss schnell mit seinem Personal kommunizieren. Anstatt über den Lärm zu schreien, verwendet er ein System von Handzeichen. Das ist ziemlich genau, was Signale in der Unix/Linux-Welt sind - eine Möglichkeit für Prozesse, schnell und effizient zu kommunizieren.
Signale sind Software-Unterbrechungen, die an ein Programm gesendet werden, um anzuzeigen, dass ein wichtiger Ereignis aufgetreten ist. Diese Ereignisse können von Benutzeranfragen bis hin zu außergewöhnlichen Laufzeitvorkommnissen reichen.
Liste der Signale
Genau wie Chef Unix möglicherweise unterschiedliche Handzeichen für "mehr Salz", "schnell machen" oder "pause machen" hat, haben Unix/Linux-Systeme eine Vielzahl von Signalen für verschiedene Zwecke. Sehen wir uns einige der häufigsten an:
Signal Name | Signal Number | Description |
---|---|---|
SIGHUP | 1 | Hangup erkannt auf Steuerterminal oder Tod des steuernden Prozesses |
SIGINT | 2 | Unterbrechung von der Tastatur (Ctrl+C) |
SIGQUIT | 3 | Beenden von der Tastatur (Ctrl+) |
SIGKILL | 9 | Tötungssignal (kann nicht abgefangen oder ignoriert werden) |
SIGTERM | 15 | Beendigungssignal |
SIGSTOP | 17, 19, 23 | Stoppt den Prozess (kann nicht abgefangen oder ignoriert werden) |
Standardaktionen
Wenn ein Signal an einen Prozess gesendet wird, wird der Prozess eine Standardaktion ausführen,除非另有指示。 Diese Standardaktionen sind wie die instinktiven Reaktionen unseres Küchenpersonals. Zum Beispiel:
- Beenden des Prozesses
- Ignorieren des Signals
- Core-Dump erstellen
- Stoppen des Prozesses
- Fortsetzen eines gestoppten Prozesses
Signale senden
Nun lernen wir, wie man diese Signale sendet. In Unix/Linux verwenden wir den Befehl kill
, um Signale an Prozesse zu senden. Lass dich nicht vom Namen täuschen - kill
beendet nicht immer Prozesse; es ist nur eine Möglichkeit, Signale zu senden.
So kannst du es verwenden:
kill -signal_name process_id
Zum Beispiel, um ein SIGTERM-Signal an Prozess 1234 zu senden:
kill -SIGTERM 1234
Oder, indem man die Signalnummer verwendet:
kill -15 1234
Signale abfangen
Was wäre, wenn unser Küchenpersonal entscheiden könnte, wie es auf die Signale von Chef Unix reagiert, anstatt immer die Standardreaktion zu folgen? Das ist, was Signalabfang in der Programmierung ermöglicht.
In Shell-Skripten verwenden wir den Befehl trap
, um Signale abzufangen und anzugeben, was bei ihrem Empfang zu tun ist. Hier ist die grundlegende Syntax:
trap command signal(s)
Sehen wir uns ein Beispiel an:
#!/bin/bash
trap "echo Bonjour!" SIGINT SIGTERM
echo "Es ist eine Falle!"
while true
do
sleep 60
done
In diesem Skript wird "Bonjour!" ausgegeben, wenn es entweder SIGINT oder SIGTERM empfängt, anstatt zu beenden. Es ist, als würde unser Küchenpersonal sagen: "Wenn der Chef anhalten signalisiert, sage 'Bonjour!' anstatt wirklich anzuhalten."
Bereinigung von temporären Dateien
Eine häufige Verwendung von Fallen ist das Bereinigen von temporären Dateien, bevor ein Skript beendet wird. Hier ist ein Beispiel:
#!/bin/bash
# Erstelle eine temporäre Datei
temp_file=$(mktemp)
# Richte eine Falle ein, um die temporäre Datei beim Beenden zu entfernen
trap "rm -f $temp_file" EXIT
# Verwende die temporäre Datei
echo "Hallo, Welt!" > $temp_file
cat $temp_file
# Die temporäre Datei wird automatisch entfernt, wenn das Skript beendet wird
Dieses Skript erstellt eine temporäre Datei, schreibt darauf, liest davon und entfernt sie automatisch, wenn das Skript beendet wird, dank der Falle.
Signale ignorieren
Manchmal möchtest du bestimmte Signale ignorieren. In unserer Küchenanalogie wäre das, als würde man dem Chef sagen: "Wie oft du auch signalisierst, dass mehr Salz gegeben werden soll, ich gebe kein weiteres hinzu!"
So kannst du ein Signal ignorieren:
trap "" SIGINT
Dies weist das Skript an, nichts zu tun, wenn es ein SIGINT-Signal empfängt.
Fallen zurücksetzen
Was wäre, wenn du nach dem Abfangen eines Signals wieder zur Standardaktion zurückkehren möchtest? Du kannst eine Falle wie folgt zurücksetzen:
trap - SIGINT
Dies entfernt die Falle für SIGINT und kehrt zur Standardaktion zurück.
Hier ist ein vollständigeres Beispiel:
#!/bin/bash
# Initially, trap SIGINT
trap "echo You can't stop me!" SIGINT
echo "Try to stop me with Ctrl+C..."
sleep 10
# Now, reset the trap
trap - SIGINT
echo "Okay, now you can stop me with Ctrl+C..."
sleep 10
echo "If you see this, you didn't stop me!"
Dieses Skript fängt initially SIGINT ab und setzt die Falle nach 10 Sekunden zurück. Es ist, als würde unser Küchenpersonal sagen: "Ignoriere das Stoppsignal für 10 Sekunden, dann kehrt zu normal zurück."
Und das ist es, Leute! Wir haben die Welt der Unix/Linux-Signale und -Fallen bereist. Denke daran, Übung macht den Meister. Versuche, deine eigenen Skripte zu schreiben, experimentiere mit verschiedenen Signalen, und bald wirst du wie ein echter Maestro deine eigenen Prozessor-Orchester leiten. Viel Spaß beim Programmieren!
Credits: Image by storyset