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!

Unix / Linux - Signals and Traps

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:

  1. Beenden des Prozesses
  2. Ignorieren des Signals
  3. Core-Dump erstellen
  4. Stoppen des Prozesses
  5. 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