Signale
100%

Prozesse · Lektion 6

Signale

Erfahre, wie Linux Signale zur Prozesssteuerung und Ereignisbenachrichtigung erzeugt, blockiert, zustellt und behandelt.

Ein Signal ist eine asynchrone Benachrichtigung, die einem Prozess oder einem bestimmten Thread zugestellt wird. Signale melden Ereignisse und fordern Aktionen an, übertragen aber im Vergleich zu datenorientierten Mechanismen der Interprozesskommunikation nur begrenzte Informationen.

Woher Signale stammen

Signale können aus mehreren Quellen stammen:

  • Ein Terminal kann bei Ctrl-C SIGINT oder bei Ctrl-Z SIGTSTP erzeugen und an die Vordergrundprozessgruppe richten.
  • Der Kernel kann ein synchrones Signal wie SIGSEGV erzeugen, wenn ein Thread auf eine ungültige Speicheradresse zugreift.
  • Ein Prozess kann ein autorisiertes Signal an einen anderen Prozess oder eine Prozessgruppe senden.
  • Zeitgeber, Änderungen des Kindprozesszustands und Terminal-Hangups können weitere Signale erzeugen.

Der Sender muss über die entsprechende Berechtigung verfügen, die gewöhnlich auf Zugangsdaten oder Capabilities beruht. Signale sind daher eine vom Kernel vermittelte Steuerungsschnittstelle und keine uneingeschränkten Nachrichten zwischen beliebigen Benutzern.

Welches Signal erzeugt ein Terminal gewöhnlich bei Ctrl-C?

Behandlungen und Standardaktionen

Die meisten Signale besitzen eine prozessweite Behandlung, die eine von drei Reaktionen auswählt:

  • die festgelegte Standardaktion des Signals ausführen
  • das Signal ignorieren
  • einen vom Benutzer eingerichteten Handler aufrufen

Die Standardaktionen unterscheiden sich: Ein Signal kann beenden, beenden und einen Core-Dump erzeugen, anhalten, fortsetzen oder ignoriert werden. Das Abfangen von SIGTERM kann einem Programm ermöglichen, ein geordnetes Herunterfahren einzuleiten. Ein Handler muss jedoch strenge Regeln zur Async-Signal-Sicherheit einhalten, und das Programm kann seine Beendigung weiterhin verzögern oder ablehnen.

Signalnamen sind portabler und lesbarer als Nummern. Obwohl verbreitete Linux-Architekturen SIGTERM als 15 verwenden, solltest du nicht annehmen, dass alle Signalenummern außer den vom jeweiligen Standard garantierten überall identisch sind. Verwende kill -l, um die lokale Zuordnung zu prüfen.

Warum kann ein Prozess geordnet auf SIGTERM reagieren?

Blockierte und ausstehende Signale

Threads besitzen Signalmasken, die die Zustellung ausgewählter Signale vorübergehend blockieren können. Ein erzeugtes blockiertes Signal bleibt ausstehend, bis es zugestellt werden kann, vorbehaltlich der Regeln für Standard- und Echtzeitsignale. Mehrere Standardsignale desselben Typs können zusammengefasst werden, statt jedes Auftreten einzeln in eine Warteschlange zu stellen.

In einem Prozess mit mehreren Threads kann ein an den Prozess gerichtetes Signal einem geeigneten Thread zugestellt werden, der es nicht blockiert; ein an einen Thread gerichtetes Signal zielt auf den angegebenen Thread. Eine korrekte Signalgestaltung erfordert daher mehr als die Prüfung, ob „der Prozess es blockiert“.

Was geschieht gewöhnlich, wenn ein blockierbares Signal erzeugt wird, während sein Ziel es blockiert?

Signale, die nicht behandelt werden können

SIGKILL beendet einen Prozess und SIGSTOP hält ihn an. Keines der beiden Signale kann abgefangen, ignoriert oder blockiert werden. Dadurch behält der Kernel die letztliche Kontrolle. Zugleich bedeutet dies, dass SIGKILL keine Gelegenheit zur Bereinigung auf Anwendungsebene bietet.

Selbst SIGKILL lässt eine Aufgabe aus Sicht eines Beobachters möglicherweise nicht sofort verschwinden. Eine Aufgabe kann in einem nicht unterbrechbaren Kernelvorgang warten, und nach der Beendigung muss ihr Elternprozess den Status weiterhin aufräumen.

Welches Paar kann weder abgefangen noch ignoriert oder blockiert werden?

Lektion abgeschlossen

Sie haben Signale abgeschlossen

Du kannst nun die wichtigsten Phasen und Einschränkungen der Linux-Signalbehandlung erklären.

  • Bestimme vom Terminal, Kernel und von Prozessen erzeugte Signale.

  • Unterscheide Standardaktionen, ignorierte Signale und Handler.

  • Setze Blockierung mit ausstehender Zustellung und Threadmasken in Beziehung.

  • Denke daran, dass SIGKILL und SIGSTOP weder behandelt noch blockiert werden können.

Lernfortschritt speichern

Erstellen Sie ein kostenloses Konto, um diese Lektion zu speichern und auf jedem Gerät weiterzulernen.

Kostenloses Konto erstellen
Nächste Lektion
Zurück zu Prozesse