signal(5) signal(5)
NAME
signal - Signale
SYNTAX
#include <signal.h>
BESCHREIBUNG
Ein Signal ist die asynchrone Benachrichtigung über ein Ereignis. Ein
Signal wird für einen Prozeß generiert (oder an einen Prozeß gesen-
det), wenn das mit dem Signal verbundene Ereignis zum ersten Mal auf-
tritt. Beispiele für solche Ereignisse sind Gerätefehler, abgelaufene
Zeitgeber oder eine Aktivität am Terminal. Weiterhin können Signale
das Ergebnis eines kill()- oder sigsend()-Systemaufrufs sein. Unter
bestimmten Umständen generiert dasselbe Ereignis Signale für mehrere
Prozesse. Ein Prozeß kann die Quelle und die genaue Ursache für die
Erzeugung eines Signals feststellen [siehe siginfo(5)].
Jeder Prozeß kann eine Systemaktion angeben, die als Reaktion auf
jedes an ihn gesendete Signal auszuführen ist. Dies wird als die Vor-
einstellung des Signals bezeichnet. Die Gruppe der Signalaktionen für
einen Prozeß wird von der des Vaterprozesses initialisiert. Nachdem
eine Aktion für ein bestimmtes Signal installiert wurde, gilt diese so
lange, bis eine andere Voreinstellung explizit durch einen Aufruf von
sigaction()), signal() oder sigset() angefordert wird, oder bis der
Prozeß eine exec-Funktion ausführt [siehe sigaction(2) und signal(2)].
Wenn ein Prozeß eine der exec-Funktionen ausführt, werden alle Sig-
nale, deren Voreinstellung auf Bearbeitung des Signals steht, auf
SIGDFL umgestellt. Alternativ dazu kann ein Prozeß anfordern, daß das
System die Voreinstellung eines Signals nach dessen Empfang eines Sig-
nals automatisch auf SIGDFL umstellt [siehe sigaction(2) und
signal(2)].
Ein Signal gilt als an einen Prozeß ausgeliefert, sobald die für die-
sen Prozeß und dieses Signal vorgesehene Aktion ausgeführt wurde. Von
dem Zeitpunkt seiner Erzeugung bis zu seiner Auslieferung wird ein
Signal als unbearbeitet (Pending) bezeichnet [siehe sigpending(2)].
Normalerweise kann dieser Zustand von einer Anwendung nicht erkannt
werden. Ein Signal kann jedoch von seiner Auslieferung an einen Prozeß
blockiert sein [siehe signal(2) und sigprocmask(2)]. Wenn für ein
blockiertes Signal eine andere Aktion als das Ignorieren des Signals
vorgesehen ist, und wenn dieses Signal für den Prozeß erzeugt wird, so
bleibt das Signal unbearbeitet, bis es entweder freigegeben wird, oder
sich die Voreinstellung für das Signal dahingehend ändert, daß es in
Zukunft ignoriert werden soll. Wenn die Voreinstellung für ein blok-
kiertes Signal vorsieht, daß das Signal ignoriert wird, und ein sol-
ches Signal für den Prozeß erzeugt wird, so wird es unmittelbar nach
seiner Erzeugung gelöscht.
Jeder Prozeß hat eine Signalmaske, die die Menge der Signale defi-
niert, deren Auslieferung an den Prozeß zur Zeit blockiert ist [siehe
sigprocmask(2)]. Die Signalmaske für einen Prozeß wird durch die des
Vaterprozesses initialisiert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Welche Aktion als Antwort auf ein Signal auszuführen ist, wird erst
bei der Auslieferung des Signals festgelegt, so daß Änderungen nach
der Erzeugung des Signals möglich sind. Die Festlegung der Aktion ist
dabei unabhängig von dem Signalauslöser.
signal.h deklariert Konstanten, die sich auf Systemsignale beziehen:
_______________________________________________________________________
| Name | Wert| Standard| Ereignis |
|__________|______|__________|_________________________________________|
| SIGHUP | 1 | Exit | Hangup [siehe termio(7)] |
| SIGINT | 2 | Exit | Unterbrechungssignal [siehe termio(7)] |
| SIGQUIT | 3 | Core | Ende [siehe termio(7)] |
| SIGILL | 4 | Core | Unzulässige Instruktion |
| SIGTRAP | 5 | Core | Unterbrechung (Trap) bei Ablaufverfol- |
| | | | gung |
| SIGIOT | 6 | Core | Abbruch |
| SIGABRT | 6 | Core | Abbruch |
| SIGEMT | 7 | Core | Unterbrechung (Trap) bei Emulation |
| SIGFPE | 8 | Core | Arithmetische Ausnahmesituation |
| SIGKILL | 9 | Exit | Bedingungsloser Abbruch |
| SIGBUS | 10 | Core | Adreßfehler |
| SIGSEGV | 11 | Core | Unerlaubter Zugriff auf Hauptspeicher |
| SIGSYS | 12 | Core | Fehlerhafter Systemaufruf |
| SIGPIPE | 13 | Exit | Ausgabe auf Pipe, von der niemand |
| | | | liest (Broken Pipe) |
| SIGALRM | 14 | Exit | Ablauf der mit alarm vorgegebenen |
| | | | Zeitscheibe |
| SIGTERM | 15 | Exit | Beendet |
| SIGUSR1 | 16 | Exit | Benutzersignal 1 |
| SIGUSR2 | 17 | Exit | Benutzersignal 2 |
| SIGCHLD | 18 | Ignore | Status eines Sohnprozesses |
| SIGPWR | 19 | Ignore | Stromausfall/Neustart |
| SIGWINCH | 20 | Ignore | Änderung der Fenstergröße |
| SIGURG | 21 | Ignore | Dringender Vorfall an Socket |
| SIGIO | 22 | Ignore | E/A auf Socket möglich (entspricht |
| | | | SIGPOLL) |
| SIGPOLL | 22 | Exit | Regelmäßig auftretendes Ereignis |
| SIGSTOP | 23 | Stop | Angehalten (Signal) |
| SIGTSTP | 24 | Stop | Angehalten (Benutzer) [siehe termio(7)]|
| SIGCONT | 25 | Ignore | Fortgesetzt |
| SIGTTIN | 26 | Stop | Angehalten (Eingabe auf TTY) [siehe |
| | | | termio(7)] |
| SIGTTOU | 27 | Stop | Angehalten (Ausgabe auf TTY) [siehe |
| | | | termio(7)] |
| SIGVTALRM| 28 | Exit | Virtueller Zeitnehmer abgelaufen |
| SIGPROF | 29 | Exit | Zeitgeber für Profildaten abgelaufen |
| SIGXCPU | 30 | Core | CPU-Zeitlimit überschritten [siehe |
| | | | getrlimit(2)] |
| SIGXFSZ | 31 | Core | Maximale Dateigröße überschritten |
| | | | [siehe getrlimit(2)] |
|__________|______|__________|_________________________________________|
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Über die Systemaufrufe signal(), sigsett() und sigaction() kann ein
Prozeß für ein Signal eine von drei möglichen Voreinstellungen vorse-
hen: die für dieses Signal vorgesehene Standardaktion, das Ignorieren
des Signals oder die Bearbeitung des Signals.
signal.h enthält die Definitionen folgender symbolischer Konstanten,
die zu einem Ausdruck des Typs void(*)(int) expandieren, und deren
Wert keiner deklarierbaren Funktion entspricht:
SIGDFL Standardsignalbehandlung.
SIGERR Return-Wert von signal() bei einem Fehler.
SIGIGN Ignorieren des Signals.
Außerdem sind in signal.h die folgenden Datentypen definiert:
sigatomict Integraltyp eines Objekts, auf das auch bei einer
asynchronen Unterbrechung zugegriffen werden kann.
sigsett Integraltyp oder Struktur eines Objekts für die Dar-
stellung von Signalmengen.
pidt Ist in <sys/types.h> [siehe types(5)] beschrieben.
signal.h stellt die Deklaration von struct sigaction zur Verfügung,
die zumindest die folgenden Komponenten enthält.
Nur gültig, wenn mit "c89" generiert:
void(*sahandler)(int)
Aktion bei Empfang eines Signals.
sigsett samask Signalmenge, die während der Ausführung einer Sig-
nalbehandlungsfunktion blockiert wird.
int saflags Spezielle Flags.
void (*)(int, siginfot *, void *) sasigaction
Zeiger auf eine Signalbehandlungsfunktion oder eines
der Makros SIGIGN oder SIGDFL.
Nur gültig, wenn mit "cc" generiert:
void (*sahandler)();
sigsett samask;
int saflags;
Der von sahandler und sasigaction belegte Speicher kann sich über-
lappen, so daß ein portierbares Programm nicht beide Funktionen
gleichzeitig verwenden darf.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Die folgenden Konstanten sind in signal.h deklariert:
SANOCLDSTOP Bei Abbruch von Kindprozessen soll SIGCHILD nicht
generiert werden.
SIGBLOCK Die Ergebnismenge besteht aus der aktuellen Menge
und der Signalmenge, auf die das Argument set zeigt.
SIGUNBLOCK Die Ergebnismenge ist die Schnittmenge aus der aktu-
ellen Menge und der Signalmenge, auf die das Argu-
ment set zeigt.
SIGSETMASK Die Ergebnismenge ist die Signalmenge, auf die set
zeigt.
SAONSTACK Die Auslieferung der Signale erfolgt in einen alter-
nativen Stack.
SARESETHAND Die Voreinstellungen der Signale werden vor Eintritt
in die Signalbehandlungsroutinen auf SIGDFL
gesetzt.
SARESTART Bestimmte Funktionen können erneut gestartet werden.
SASIGINFO Zusätzliche Informationen werden bei Empfang eines
Signals an die Signalbehandlungsroutinen übergeben.
SANOCLDWAIT Die Implementierungen erstellen nach dem Abbruch der
Sohnprozesse keine Zombie-Prozesse.
SANODEFER Signale werden bei Eintritt in die Signalbehand-
lungsroutine nicht automatisch blockiert.
SSONSTACK Der Prozeß wird auf einem alternativen Signal-Stack
ausgeführt.
SSDISABLE Der alternative Signal-Stack ist deaktiviert.
MINSIGSTKSZ Mindestgröße des Stacks für eine Signalbehandlungs-
routine.
SIGSTKSZ Standardgröße in Bytes für den alternativen Signal-
Stack.
Die Struktur ucontextt wird über typedef definiert wie in
<ucontext.h> beschrieben [siehe ucontext(5)].
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Die Include-Datei signal.h definiert den Typ stackt als eine Struk-
tur, die zumindest folgende Komponenten enthält:
void *sssp Stack-Basis oder -Zeiger.
sizet sssize Stack-Größe.
int ssflags Flags.
Die Include-Datei signal.h definiert die Struktur sigstack, die zumin-
dest folgende Komponenten enthält:
int ssonstack Dieser Wert is ungleich Null, wenn der Signal-Stack
verwendet wird.
void *sssp Zeiger auf den Signal-Stack.
Die Include-Datei signal.h definiert den Typ siginfot als eine Struk-
tur, die zumindest folgende Komponenten enthält:
int sisigno Signalnummer.
int sierrno Wenn ungleich Null, ein diesem Signal zugeordneter
errno-Wert wie in <errno.h> definiert.
int sicode Signalcode.
pidt sipid ID des sendenden Prozesses.
uidt siuid Reale Benutzer-ID des sendenden Prozesses.
void *siaddr Adresse der fehlerhaften Anweisung.
int sistatus Exit-Wert oder -Signal.
long siband Gruppe von Ereignissen für SIGPOLL.
Die in der Spalte Code der folgenden Tabelle aufgeführten Makros sind
zur Verwendung als Werte von sicode definiert. Hierbei handelt es
sich um die signalspezifische Ursache für die Signalerzeugung.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Signal Code Ursache
_________________________________________________________________________
SIGILL ILLILLOPC ungültige Prozessoranweisung
ILLILLOPN ungültiger Operand
ILLILLADR ungültiger Adressierungsmodus
ILLILLTRP ungültige Unterbrechung (Trap)
ILLPRVOPC privilegierte Prozessoranweisung
ILLPRVREG privilegierte Register
ILLCOPROC Fehler des Coprozessors
ILLBADSTK interner Stack-Fehler
_________________________________________________________________________
SIGFPE FPEINTDIV ganzzahlige Division durch Null
FPEINTOVF ganzzahliger Überlauf
FPEFLTDIV Gleitkommafehler: Division durch Null
FPEFLTOVF Gleitkommafehler: Überlauf
FPEFLTUND Gleitkommafehler: Unterlauf
FPEFLTRES Gleitkommafehler: ungenaues Ergebnis
FPEFLTINV ungültige Gleitkommaoperation
FPEFLTSUB Index außerhalb des gültigen Bereichs
_________________________________________________________________________
SIGSEGV SEGVMAPERR Adresse nicht auf Objekt abgebildet
SEGVACCERR ungültige Zugriffsrechte für abgebildetes Objekt
_________________________________________________________________________
SIGBUS BUSADRALN ungültige Adreßausrichtung
BUSADRERR nichtexistierende physische Adresse
BUSOBJERR objektspezifischer Hardwarefehler
_________________________________________________________________________
SIGTRAP TRAPBRKPT Prozeß-Haltepunkt
TRAPTRACE Prozeß-Trace-Unterbrechung
_________________________________________________________________________
SIGCHLD CLDEXITED Sohnprozeß über exit beendet
CLDKILLED Sohnprozeß wurde nicht normal beendet, ohne
Erstellung einer Speicherabzugsdatei
CLDDUMPED Sohnprozeß wurde nicht normal beendet, mit
Erstellung einer Speicherabzugsdatei
CLDKILLED Sohnprozeß über kill beendet
CLDDUMPED Sohnprozeß wurde nicht normal beendet
CLDTRAPPED überwachter Sohnprozeß empfing Signal
CLDSTOPPED Sohnprozeß angehalten
CLDCONTINUED angehaltener Sohnprozeß wurde fortgesetzt
_________________________________________________________________________
SIGPOLL POLLIN Dateneingabe verfügbar
POLLOUT Ausgabepuffer verfügbar
POLLMSG Eingabemeldung verfügbar
POLLERR E/A-Fehler
POLLPRI Eingabe mit hoher Priorität verfügbar
POLLHUP Verbindung abgebrochen
Implementierungen können zusätzliche, in dieser Liste nicht enthaltene
sicode-Werte unterstützen, sie können Werte aus der Liste unter ande-
ren Umständen, als den in der Liste beschriebenen, erzeugen, und sie
können Erweiterungen oder auch Einschränkungen enthalten, die
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
verhindern, daß einige dieser Werte erzeugt werden. Es werden jedoch
keine anderen als die in der Liste beschriebenen Werte erzeugt, wenn
die in der Liste beschriebenen Umstände vorliegen.
Zusätzlich sind noch folgende signalspezifischen Informationen verfüg-
bar:
Signal Komoponente Wert
______________________________________________________________________
SIGILL void * siaddr Adresse der fehlerhaften Anweisung
SIGFPE
______________________________________________________________________
SIGSEGV void * siaddr Adresse des fehlerhaften Speicherzugriffs
SIGBUS
______________________________________________________________________
SIGCHLD pidt sipid Prozeß-ID des Sohnprozesses
int sistatus Exit-Wert oder -Signal
uidt siuid Reale Benutzer-ID des Prozesses, der das
Signal gesendet hat
______________________________________________________________________
SIGPOLL long siband Gruppe von Ereignissen für POLLIN, POLLOUT
oder POLLMSG
Für einige Implementierungen kann der Wert von siaddr ungenau sein.
Die folgenden Funktionen sind in signal.h deklariert, sie können aber
auch als Makros definiert werden:
void (*bsdsignal(int sig, void (*func)(int)))(int);
int kill(pidt pid, int sig);
int killpg(pidt pgrp, int sig);
int raise(int sig);
int sigaction(int sig, const struct sigaction *act,
int sigaction(int sig, const struct sigaction *act,
struct sigaction *oact);
int sigaddset(sigsett *set, int signo);
int sigaltstack(const stackt *ss, stackt *oss);
int sigdelset(sigsett *set, int signo);
int sigemptyset(sigsett *set);
int sigfillset(sigsett *set);
int sighold(int sig);
int sigignore(int sig);
int siginterrupt(int sig, int flag);
int sigismember(const sigsett *set, int);
void (*signal(int sig, void (*func) (int))) (int);
int sigpause(int sig);
int sigpending(sigsett *set);
int sigprocmask(int how, const sigsett *set, sigsett *oset);
int sigrelse(int sig); void *sigset(int sig, void
(*disp)(int)))(int); int sigstack(struct sigstack *ss,
struct sigstack *oss);
int sigsuspend(const sigsett *sigmask);
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
Standardaktion
Eine Voreinstellung von SIGDFL gibt die Standardaktion an. Die Stan-
dardaktion eines jeden Signals ist in der obigen Liste aufgeführt.
Auswahlmöglichkeiten sind:
Exit Bei Empfang des Signals muß der empfangende Prozeß beendet
werden, mit allen Konsequenzen, wie sie in exit(2) beschrie-
ben sind.
Core Bei Empfang des Signals muß der empfangende Prozeß beendet
werden, mit allen Konsequenzen, wie sie in exit(2) beschrie-
ben sind. Zusätzlich wird ein Speicherabzug (Core) des Pro-
zesses im aktuellen Arbeitsverzeichnis angelegt.
Stop Bei Empfang des Signals wird der empfangende Prozeß angehal-
ten.
Ignore Bei Empfang des Signals wird dieses durch den empfangenden
Prozeß ignoriert. Dies entspricht der Voreinstellung von
SIGIGN.
Signal bearbeiten
Wird als Voreinstellung die Adresse einer Funktion verwendet, so
bedeutet dies, daß der Prozeß bei Empfang dieses Signals die Signalbe-
handlungsroutine an der angegebenen Adresse ausführen soll. Normaler-
weise erhält die Signalbehandlungsroutine als einziges Argument die
Nummer des empfangenen Signals; durch die Verwendung der Funktion
sigaction() zur Voreinstellung können jedoch zusätzliche Parameter
vorgesehen werden [siehe sigaction(2)]. Solange die Signalbehandlungs-
routine keine anderen Vorkehrungen trifft, wird der Prozeß nach Been-
digung der Signalbehandlungsroutine an der Stelle fortgesetzt, an der
er unterbrochen wurde. Bei Angabe einer ungültigen Funktionsadresse
ist das Verhalten nicht definiert.
Wurde die Voreinstellung durch die Funktionen sigset() oder
sigaction() vorgenommen, so wird das Signal automatisch durch das
System blockiert, während die Signalbehandlungsfunktion aktiv ist.
Wenn longjmp() [siehe setjmp(3C)] verwendet wird, um die Signalbehand-
lungsfunktion zu verlassen, muß das Signal explizit durch den Benutzer
freigegeben werden [siehe signal(2) und sigprocmask(2)].
Unterbricht die Ausführung einer Signalbehandlungsroutine einen blok-
kierten Systemaufruf, so wird die Routine ausgeführt. Der unterbro-
chene Systemaufruf liefert danach den Wert -1 an den aufrufenden Pro-
zeß zurück, und errno wird auf den Wert EINTR gesetzt. Ist hingegen
das Flag SARESTART gesetzt, so wird der Systemaufruf ohne Meldung neu
gestartet.
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
signal(5) signal(5)
HINWEISE
Die Voreinstellungen der Signale SIGKILL und SIGSTOP können nicht
geändert werden. Das System erzeugt einen Fehler, wenn dies versucht
wird.
Die Signale SIGKILL und SIGSTOP können nicht blockiert werden. Die
Einhaltung dieser Einschränkung wird ohne entsprechende Meldung
erzwungen.
Empfängt ein Prozeß das Signal SIGCONT, so werden, unabhängig von den
aktuellen Voreinstellungen, alle unbearbeiteten Signale SIGSTOP,
SIGTSTP, SIGTTIN und SIGTTOU gelöscht. Außerdem wird der Prozeß fort-
gesetzt, sofern er angehalten wurde.
SIGPOLL wird ausgegeben, wenn ein zu einer STREAMS-Datei gehörender
Dateideskriptor ein unbearbeitetes "auswählbares" Ereignis aufweist.
Ein Prozeß muß die Zustellung dieses Signals durch einen ioctl-Aufruf
mit ISETSIG explizit anfordern. Ansonsten wird der Prozeß niemals ein
Signal SIGPOLL erhalten.
Wenn die Voreinstellung für das Signal SIGCHLD mit signal() oder
sigset() vorgenommen wurde, oder mit sigaction() und mit gesetztem
Flag SANOCLDSTOP, so wird dieses Signal nur dann an den aufrufenden
Prozeß gesendet, wenn seine Sohnprozesse enden. Ansonsten würde dieses
Signal auch gesendet, wenn die Sohnprozesse aufgrund der Ablaufsteue-
rung angehalten oder fortgesetzt wurden.
Der Name SIGCLD wird ebenfalls in dieser Include-Datei definiert und
bezeichnet dasselbe Signal wie SIGCHLD. SIGCLD wird aus Kompatibili-
tätsgründen weiter unterstützt, neue Anwendungen sollten jedoch
SIGCHLD verwenden.
Die Voreinstellung von Signalen, die als SIGIGN vererbt werden,
sollte nicht verändert werden.
SIEHE AUCH
alarm(2), bsdsignal(2), exit(2), getrlimit(2), introprm2(2),
ioctl(2), kill(2), pause(2), sigaction(2), sigaltstack(2), signal(2),
sigprocmask(2), sigsend(2), sigsuspend(2), wait(2), waitid(2),
sigsetops(3C), errno(5), siginfo(5), types(5), ucontext(5).
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98