Beschreibung | signal() legt fest, wie der Empfang eines Signals zukünftig behandelt werden soll.
sig kann jedes Signal sein, das vom System definiert ist, außer SIGKILL und SIGSTOP (siehe signal.h ). func () definiert die Signalaktion. Folgende Werte sind möglich: SIG_DFL (voreingestellte Signalbehandlung)
SIG_IGN (Ignorieren des Signals)
die Adresse einer Signalbehandlungsfunktion In diesem Fall fügt das System das Signal sig der Signalmaske des aufrufenden Prozesses hinzu, bevor die Signalbehandlungsfunktion ausgeführt wird. Wenn die Ausführung der Signalbehandlungsfunktion beendet ist, stellt das System die Signalmaske des aufrufenden Prozesses wieder auf den Zustand um, der vor Empfang des Signals herrschte.
Wenn ein Signal auftritt und func () auf eine Funktion zeigt, werden nacheinander folgende Schritte ausgeführt: Ein Äquivalent zu folgender signal -Funktion wird ausgeführt: signal( sig, SIG_DFL);
Wenn in diesem Beispiel der Wert von sig SIGILL ist, wird SIG_DFL zurückgesetzt. Ein Äquivalent der folgenden Funktion wird ausgeführt: ( *func )( sig );
Die Signalbehandlungsfunktion func () kann durch eine return -Anweisung, eine abort -, exit - oder longjmp -Funktion beendet werden. Wenn func () eine return -Anweisung ausführt und der Wert von sig SIGFPE , SIGILL oder SIGDVZ ist, ist das Verhalten nicht definiert. Ansonsten setzt das Programm die Ausführung an dem Punkt fort, an dem es unterbrochen wurde. Wenn ein Signal auftritt, ohne dass abort() , kill() oder raise() aufgerufen wurden, ist das Verhalten nicht definiert, wenn die Signalbehandlungsfunktion eine X/Open-konforme Bibliotheksfunktion aufruft, die nicht in der obigen Tabelle steht, oder wenn auf ein Objekt im statischen Speicher zugegriffen wird und das keine statische Variable vom Typ volatile sig_atomic_t ist. Wenn ein derartiger Aufruf auf einen Fehler läuft, ist der Wert von errno nicht definiert. Bei Programmstart wird ein Äquivalent der folgenden Funktion für einige Signale ausgeführt: signal( sig, SIG_IGN);
Ein Äquivalent der folgenden Funktion wird für alle anderen Signale ausgeführt (siehe exec): signal( sig, SIG_DFL);
Die Funktionen sigset() , sighold() , sigignore() , sigpause() und sigrelse() erlauben Applikationsprozessen das vereinfachte Verwalten von Signalen. sigset() wird verwendet, um Signalbehandlungen zu verändern. sig gibt dabei das Signal an, welches jedes außer SIGKILL und SIGSTOP sein darf. disp definiert die Behandlung des Signals, welches SIG_DFL , SIG_IGN oder die Adresse einer Signalbehandlungsroutine sein darf. Wird sigset() verwendet und ist disp die Adresse einer Signalbehandlungsroutine, fügt das System das Signal sig der Signalmaske des aufrufenden Prozesses hinzu, bevor die Signalbehandlungsroutine ausgeführt wird. Ist die Ausführung der Signalbehandlungsroutine beendet, stellt das System die Signalmaske des aufrufenden Protesses wieder auf den Zustand, der vor dem Empfang des Signals herrschte. Wird sigset() benutzt und ist disp gleich SIG_HOLD , so wird sig zur Signalmaske des aufrufenden Prozesses hinzugefügt, und die Signalbehandlung bleibt unverändert.
sighold() fügt sig der Signalmaske des aufrufenden Prozesses hinzu.
sigrelse() entfernt sig von der Signalmaske des aufrufenden Prozesses.
sigignore() stellt die Behandlung von sig auf SIG_IGN .
sigpause() entfernt sig von der Signalmaske des aufrufenden Prozesses und deaktiviert den aufrufenden Prozess, bis ein Signal empfangen wird.
Wird eine der obigen Funktionen verwendet, um die Behandlung von SIGCHLD auf SI-G_IGN zu setzen, so erzeugen die Sohnprozesse des aufrufenden Prozesses keine Zom-bie-Prozesse, wenn sie beendet werden. Wenn der aufrufende Prozess nacheinander auf seine Sohnprozesse wartet, blockiert er, bis alle seine Sohnprozesse terminiert sind. Dann wird der Wert -1 zurückgeliefert und errno enthält die Fehlernummer ECHILD (siehe wait(), waitid(), waitpid()). |
| EINVAL
| sig ist eine ungültige Signalnummer, oder es wurde versucht, ein Signal abzufangen, das nicht abgefangen werden kann, oder ein Signal zu ignorieren, das nicht ignoriert werden kann, oder es wurde versucht, die Aktion auf SIG_DFL zu setzen bei einem Signal, dass weder abgefangen noch ignoriert werden kann. |