
Von APUE
Ein Prozess hat drei Möglichkeiten, mit einem Signal umzugehen.
Signal ignorieren. Diese Option wird nicht für Signale empfohlen, die eine Hardwareausnahme anzeigen, wie z. B. eine Division durch Null oder eine Referenzierung des Speichers außerhalb des Adressraums des Prozesses, da die Ergebnisse undefiniert sind.
Lassen Sie die Standardaktion ausführen. Bei einer Division durch Null wird der Prozess standardmäßig beendet.
Stellen Sie eine Funktion bereit, die aufgerufen wird, wenn das Signal auftritt (dies wird als „Abfangen“ des Signals bezeichnet). Indem wir eine eigene Funktion bereitstellen, wissen wir, wann das Signal auftritt, und können es nach Wunsch verarbeiten.
Ich glaube, es gibt nur zwei Möglichkeiten – die letzten beiden sind oben aufgeführt, und beide können das Signal „ignorieren“ (die erste Möglichkeit ist oben aufgeführt).
Habe ich das richtig verstanden oder gibt es tatsächlich drei sich nicht überschneidende Auswahlmöglichkeiten wie im Zitat? Warum?
Im Buch wird erwähnt, dass die Standardaktion mancher Signale darin besteht, sie zu ignorieren. Bedeutet das, dass die Aktion des Signals SIG_IGN oder SIG_DFL oder eine leere Funktion ist? Zum Beispiel:
DerStandardDie Aktion für SIGCHLD istignoriert. Wir beschreiben diese Optionen in Kapitel 10.
SIGCONT: Das Standard Aktion ist, einen gestoppten Prozess fortzusetzen, aber ignorierendas Signal, wenn der Vorgang nicht gestoppt wurde.
Danke.
Antwort1
Natürlich kann man einen Signalhandler schreiben, der nichts tut und somit das Signal effektiv ignoriert, aber die erste Möglichkeit besteht darin, das Signal gezielt zu ignorieren, indem man das SIG_IGN
Argument des signal()
Systemaufrufs verwendet.
In Bezug auf den Code SIGINT
gibt es unter der Annahme des Signals folgende drei Optionen:
signal(SIGINT, SIG_IGN);
ignorieren- Die Funktion nicht aufzurufen
signal()
oder sie mit aufzurufensignal(SIGINT, SIG_DFL);
und damit die Standardaktion auszuführen, d.h. den Prozess zu beenden signal(SIGINT, termination_handler);
, wobeitermination_handler()
eine Funktion ist, die beim ersten Auftreten des Signals aufgerufen wird.
Quelle:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
Im speziellen Fall von Signalen, bei denen die Standardaktion darin besteht, das Signal zu ignorieren, sind die beiden ersten Optionen ( SIG_IGN
und SIG_DFL
) identisch. Das Erstellen einer leeren Handlerfunktion hat wahrscheinlich keine sichtbaren Auswirkungen, außer einem (kleinen) Mehraufwand.
HINWEIS: Der Einfachheit halber wird in dieser Antwort verwendet, aus Gründen der Portabilität wird dies signal()
jedoch in neuem Code empfohlen.sigaction()