Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ signal(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

kill(2)

pause(2)

sigaction(2)

sigsend(2)

wait(2)

waitid(2)

signal(5)

signal(2)                                                         signal(2)

NAME
     signal, sigset, sighold, sigrelse, sigignore, sigpause - Vereinfachte
     Signalverwaltung

SYNTAX
     #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
     Die Funktion signal() wählt eine von drei Möglichkeiten zur Bearbei-
     tung eines Signals nach Empfang der Signalnummer sig aus. Wenn der
     Wert von func SIGDFL ist, wird die Standardbehandlung für dieses Sig-
     nal angewendet. Ist der Wert von func SIGIGN, wird das Signal igno-
     riert. Andernfalls muß func auf eine Funktion zeigen, die bei Auftre-
     ten dieses Signals aufzurufen ist. Eine solche Funktion wird als Sig-
     nalbehandlungsroutine (signal handler) bezeichnet.

     Wenn func auf eine Funktion zeigt und ein Signal auftritt, wird
     zunächst das Äquivalent zu

          signal(sig, SIGDFL);

     ausgeführt, oder es erfolgt eine implementierungsspezifische Blockie-
     rung des Signals. (Ist der Wert von sig SIGILL, kommt es auf die
     jeweilige Implementierung an, ob SIGDFL zurückgesetzt wird.)
     Anschließend wird das Äquivalent zu

          (*func)(sig);

     ausgeführt. Die Funktion func kann möglicherweise durch die Ausführung
     einer Anweisung return oder durch Aufrufen von abort(), exit() oder
     longjmp() beendet werden. Führt func() eine Anweisung return aus, und
     war der Wert von sig SIGFPE oder ein anderer implementierungsspezifi-
     scher Wert, der einer arithmetischen Ausnahmebedingung entspricht, so
     ist das Verhalten der Funktion unbestimmt. Andernfalls nimmt das Pro-
     gramm die Ausführung an der Stelle wieder auf, an der es unterbrochen
     wurde.







Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

signal(2)                                                         signal(2)

     Tritt das Signal nicht aufgrund eines Aufrufs von abort(), kill() oder
     raise() auf, ist das Verhalten unbestimmt, wenn die Signalbehandlungs-
     routine eine Funktion aus der Standardbibliothek aufruft, mit Ausnahme
     der auf der Handbuchseite (Man Page) sigaction() aufgelisteten Funk-
     tionen, oder auf ein statisch gespeichertes Objekt verweist, ohne daß
     einer statischen Variablen vom Typ volatile sigatomict ein Wert
     zugeordnet wurde. Ferner ist der Wert von errno unbestimmt, wenn ein
     solcher Aufruf fehlschlägt.

     Beim Programmstart wird das Äquivalent zu

          signal(sig, SIGIGN);

     für einige Signale und das Äquivalent zu

          signal(sig, SIGDFL);

     für alle anderen Signale ausgeführt [siehe exec(2)].

     Diese Funktionen erlauben Anwendungsprozessen das vereinfachte Verwal-
     ten von Signalen. Unter signal(5) finden Sie eine Beschreibung der
     allgemeinen Signalkonzeption.

     signal() und sigset() werden verwendet, um Voreinstellungen des Sig-
     nals zu verändern. sig gibt dabei das Signal an, welches jedes außer
     SIGKILL und SIGSTOP sein darf. disp definiert die Voreinstellung des
     Signals, welche SIGDFL, SIGIGN oder die Adresse einer Signalbehand-
     lungsroutine sein darf. Wird signal() verwendet, ist disp die Adresse
     einer Signalbehandlungsroutine, und sig muß ungleich SIGILL, SIGTRAP
     und SIGPWR sein. Das System setzt zuerst die Voreinstellung des Sig-
     nals auf SIGDFL, bevor die Signalbehandlungsroutine aufgerufen wird.
     Wird sigset() verwendet und ist disp die Adresse einer Signalbehand-
     lungsroutine, fügt das System das Signal sig der Signalmaske des auf-
     rufenden Prozesses hinzu, bevor die Signalbehandlungsroutine ausge-
     führt wird. Ist die Ausführung der Signalbehandlungsroutine beendet,
     setzt das System die Signalmaske des aufrufenden Prozesses wieder auf
     den Zustand vor Ausgabe des Signals zurück. Wird sigset() benutzt und
     ist disp gleich SIGHOLD, so wird sig zur Signalmaske des aufrufenden
     Prozesses hinzugefügt, und die Voreinstellung des Signals bleibt
     unverändert.

     sighold() fügt sig der Signalmaske des aufrufenden Prozesses hinzu.

     sigrelse() entfernt sig aus der Signalmaske des aufrufenden Prozesses.

     sigignore() stellt die Voreinstellung von sig auf SIGIGN.

     sigpause() entfernt sig von der Signalmaske des aufrufenden Prozesses
     und hält den aufrufenden Prozeß so lange an, bis ein Signal empfangen
     wird. Die Funktion sigpause() setzt die Signalmaske des Prozesses wie-
     der auf den ursprünglichen Zustand zurück.



Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

signal(2)                                                         signal(2)

FEHLER
     Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
     Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
     errno(5).

     Diese Funktionen schlagen fehl, wenn eine der folgenden Bedingungen
     erfüllt ist:

     EINTR     Während des Systemaufrufs sigpause() wurde ein Signal aufge-
               fangen.

     Die Funktion signal() schlägt bei folgender Bedingung fehl:

     EINVAL    Der Wert des Arguments sig ist kein gültiges Signal oder
               entspricht SIGKILL oder SIGSTOP.

     Die Funktion signal() kann bei folgender Bedingung fehlschlagen:

     EINVAL    Es wurde versucht, SIGDFL für ein Signal zu setzen, daß
               nicht aufgefangen und/oder ignoriert werden kann.

     Die Funktionen sigset(), sighold(), sigrelse(), sigignore() und
     sigpause() schlagen bei folgender Bedingung fehl:

     EINVAL    Das Argument sig ist eine ungültige Signalnummer.

     Die Funktionen sigset() und sigignore() schlagen bei folgender Bedin-
     gung fehl:

     EINVAL    Es wurde versucht, ein Signal aufzufangen, das nicht aufge-
               fangen werden kann, oder ein Signal zu ignorieren, das nicht
               ignoriert werden kann.

ERGEBNIS
     Bei Erfolg liefert signal() die vorherige Voreinstellung des Signals
     zurück. Bei einem Fehler wird SIGERR zurückgeliefert und errno zur
     Anzeige des Fehlers gesetzt.

     Bei Erfolg liefert sigset() SIGHOLD zurück, wenn das Signal blockiert
     wurde oder die vorherige Voreinstellung, wenn es nicht blockiert
     wurde. Bei einem Fehler wird SIGERR zurückgegeben und errno zur
     Anzeige des Fehlers gesetzt.

     sigpause() hält die Ausführung des Prozesses so lange an, bis ein Sig-
     nal empfangen wird, woraufhin -1 zurückgegeben und errno auf EINTR
     gesetzt wird.

     Alle anderen Funktionen liefern bei Erfolg Null zurück. Bei einem Feh-
     ler liefern sie -1 zurück und setzen errno zur Anzeige des Fehlers.





Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

signal(2)                                                         signal(2)

HINWEISE
     Die Funktion sigaction() stellt einen sehr umfassenden und zuverlässi-
     gen Mechanismus zur Signalbehandlung zur Verfügung. In neuen Anwendun-
     gen sollte daher statt signal() die Funktion sigaction() verwendet
     werden.

     sighold() in Verbindung mit sigrelse() oder sigpause() kann dazu ver-
     wendet werden, um kritische Programmbereiche zu erstellen, in denen
     der Empfang eines Signals zeitweilig abgeschaltet wird.

     Wenn signal() oder sigset() verwendet wird, um für die Voreinstellung
     von SIGCHLD eine Signalbehandlungsroutine anzugeben, wird SIGCHLD
     nicht gesendet, wenn die Sohnprozesse des aufrufenden Prozesses
     gestoppt oder fortgesetzt werden.

     Wird eine der obigen Funktionen verwendet, um die Voreinstellung von
     SIGCHLD auf SIGIGN zu setzen, so erzeugen die Sohnprozesse des aufru-
     fenden Prozesses keine Zombie-Prozesse, wenn sie beendet werden [siehe
     exit(2)]. Wenn der aufrufende Prozeß nachfolgend auf seine Sohnpro-
     zesse wartet, blockiert er so lange, bis alle seine Sohnprozesse been-
     det sind; dann wird ein Wert von -1 zurückgeliefert, und errno enthält
     ECHILD [siehe wait(2), waitid(2)].

SIEHE AUCH
     kill(2), pause(2), sigaction(2), sigsend(2), wait(2), waitid(2),
     signal(5).




























Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026