Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

signal, sighold, sigignore, sigpause, sigrelse, sigset - Signalbehandlung ermitteln oder ändern

&pagelevel(4)&pagelevel

Definition

#include <signal.h>

void (*signal(int sig, void (* func)(int)))(int);

int sighold(int sig);

int sigignore(int sig);

int sigpause(int sig);

int sigrelse(int sig);

void (*sigset(int sig, void (*disp)(int)))(int);

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:

  1. 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.

  2. 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()).

Returnwert

Wert von func() bei erfolgreicher Beendigung .


SIG_ERR

bei Fehler, z.B. wenn sig keine gültige Signalnummer ist oder func() auf eine unzulässige Adresse zeigt. errno wird gesetzt, um den Fehler anzuzeigen.


SIG_HOLD

von sigset() bei Erfolg geliefert, wenn das Signal blockiert wurde.
Wenn es nicht blockiert wurde, liefert sigset() die vorherige Behandlung zurück.


SIG_ERR

bei Fehler von sigset(). errno enthält die entsprechende Fehlernummer.

 

Alle anderen Funktionen liefern bei Erfolg null zurück. Bei Fehler liefern sie -1 und setzen errno.

Fehler

signal() schlägt fehl, wenn gilt:

 

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.

 

BS2000

 

EFAULT

Unzulässige Adresse. (Ende)


sigset(), sighold(), sigrelse(), sigignore() und sigpause() schlagen fehl, wenn gilt:

 

EINVAL

sig ist eine ungültige Signalnummer oder bei sigset() und sigignore() wurde der Versuch gemacht, ein Signal abzufangen, das nicht abgefangen werden kann oder ein Signal zu ignorieren, das nicht ignoriert werden kann.

Hinweise

sigaction() bietet einen verständlicheren und verlässlicheren Mechanismus für die Signalsteuerung als signal(). Neue Anwendungen sollten daher sigaction() benutzen.

sighold() in Verbindung mit sigrelse() oder sigpause() kann dazu verwendet werden, kritische Programmbereiche zu erstellen, in denen der Empfang eines Signals zeitweise abgeschaltet wird.

Die Funktion sigsuspend() kann anstatt sigpause() verwendet werden, um die Portabilität zu erhöhen.

Siehe auch

exec, pause(), sigaction(),, waitid(), signal.h.