Signalnamen

Zu jedem Signal gibt es einen symbolischen Namen, der immer mit `SIG' beginnt und fuer eine Nummer steht, wie z. B. der Name `SIGINT' fuer das Signal, das generiert wird, wenn der Benutzer die Programmabbruchstaste (Strg-C) drueckt. Alle symbolischen Namen sind in <signal.h> bzw. <sys/signal.h> definiert. Kein Signal hat die Nummer 0 (Null), da diese Nummer fuer spezielle Anwendungsfaelle der Funktion "kill" vorgesehen ist.

Unter SVR4 und 4.4BSD stehen mehr als 30 Signale zur Verfuegung; das hier sind nur die /wichtigsten/ davon.

Name Beschreibung ANSIC POSIX.1 SVR4 BSD Default Aktion
SIGABRT anormale Beendigung (abort) Yes Yes Yes Yes Beendigung mit core
SIGALRM Ablauf einer Zeitschaltuhr No Yes Yes Yes Beendigung
SIGBUS Hardwarefehler No Yes Yes Yes Beendigung
SIGCHLD Statusaenderung in Kindprozess No Job Yes Yes Beendigung mit core
SIGCONT Fortsetzen angehaltener Prozesse No Job Yes Yes Ignorieren
SIGEMT Hardwarefehler No No Yes Yes Beendigung mit core
SIGFPE Arithmetischer Fehler Yes Yes Yes Yes Beendigung mit core
SIGHUP Verbindungsunterbrechung No Yes Yes Yes
SIGILL Unerlaubter Hardwarebefehl Yes Yes Yes Yes Beendigung mit core
SIGINFO Statusanforderung von Tastatur No No No Yes Ignorieren
SIGINT Unterbrechungstaste am Terminal Yes Yes Yes Yes Beendigung
SIGIO Asynchrone E/A No No Yes Yes Beendigung/Ignorieren
SIGIOT Hardwarefehler No No Yes Yes Beendigung mit core
SIGKILL Beendigung No Yes Yes Yes Beendigung
SIGPIPE Schreiben in Pipe ohne Leser No Yes Yes Yes Beendigung
SIGPOLL waehlbares Ereigniss (poll) No No Yes No Beendigung
SIGPROF Profiling-Zeitalarm (setitimer) No No Yes Yes Beendigung
SIGPWR Stromausfall No No Yes No Ignorieren
SIGQUIT Unterbrechungstaste am Terminal No Yes Yes Yes Beendigung mit core
SIGSEGV Unerlaubte Speicheradressierung Yes Yes Yes Yes Beendigung mit core
SIGSTOP Prozess anhalten No Job Yes Yes Prozess anhalten
SIGSYS Unerlaubter Systemaufruf No No Yes Yes Beendigung mit core
SIGTERM Beendigung Yes Yes Yes Yes Beendigung
SIGTRAP Hardwarefehler No No Yes Yes Beendigung mit core
SIGTSTP Terminal-Stopzeichen No Job Yes Yes Prozess anhalten
SIGTTIN Lesewunsch von Hintergrundprozess No Job Yes Yes Prozess anhalten
SIGTTOU Schreibwunsch von Hintergrundprozess No Job Yes Yes Prozess anhalten
SIGURG dringendes Ereignis No No Yes Yes Ignorieren
SIGUSR1 benutzerdefiniertes Signal No Yes Yes Yes Beendigung
SIGUSR2 benutzerdefiniertes Signal No Yes Yes Yes Beendigung
SIGVTALRM Virtueller Zeitalarm (setitimer) No No Yes Yes Beendigung
SIGWINCH Aenderung der Windows-Groesse No No Yes Yes Ignorieren
SIGXCPU Ueberschreitung des CPU-Limits (setrlimit) No No Yes Yes Beendigung mit core
SIGXFSZ Ueberschreitung des Dateigroesselimits (setrlimit) No No Yes Yes Beendigung mit core
Note
Tipp am Rande

Wenn die Z-Shell zur Verfuegung steht, kann man sie die Signalnamen und die dazu gehoerenden Signalnummern auch mit einem Einzeiler ausgeben lassen.

$ integer i=0 ;print -c ${(e)signals//*/\$((i++))\) SIG\$signals[\$i]}

In den Spalten der obigen Tabelle wird gezeigt, welche Signale jeweils von ANSI-C und POSIX.1 vorgeschrieben sind. Bei der POSIX.1 - Spalte zeigt ein "Yes" an, dass dieses Signal in jedem Fall vorgeschrieben ist; ein "Job" bedeutet, dass es sich bei diesem Signal um ein Jobkontrollsignal handelt, welches nur dann existieren muss, wenn eine Jobkontrolle vorhanden ist.

Die letzte Spalte "Default Aktion" beschreibt kurz die voreingestellte Reaktion des Prozesses, an den dieses Signal geschickt wird. So bedeutet z. B. Beendigung mit core, dass vom aktuellen Zustand des Prozesses ein Speicherimage (core image) in der Datei core im Working-Directory des Prozesses abgelegt wird.

Die Zugriffsrechte fuer die Datei core sind normalerweise 644 (rw-r—r--r), wenn sie nicht schon vorhanden ist.

Tip
Das Anlegen der Datei core ist zwar typisch fuer Unix, aber nicht Bestandteil von POSIX.1! BSD-Unix legt eine Datei core.nummer an, wobei nummer fuer die ersten 16 Zeichen des entsprechenden Programmnamens sind. Soe koennen dort mehrere core-Dateien fuer unterschiedliche Programme im gleichen Directory liegen.

Beschreibung der einzelnen Signale

SIGABRT

Dieses Signal wird beim Aufruf der abort-Funktion erzeugt. Es signalisiert, dass ein Prozess anormal beendet wurde. Unter Linux z. B. wird abort immer dann aufgerufen, wenn die beim Aufruf der assert-Funktion angegebene Bedingung nicht erfuellt ist.

SIGALRM

Dieses Signal zeigt an, dass eine zuvor mit der alarm-Funktion eingerichtete Zeitschalturh abgelaufen ist. Es wird auch generiert, wenn eine mit setitimer eingerichtetet Intervall-Zeitschalturh abgelaufen ist.

SIGBUS

Dieses Signal wird bei einem Hardwarefehler (implementierungsdefiniert) geschickt.

SIGCHLD

Dieses Signal wird immer dann an den Elternprozess geschickt, wenn sich einer seiner Kindprozesse beendet. Normalerweise wird dieses Signal ignoriert, wenn der Elernprozess es nicht abfaengt. Ueberlicherweise faengt man dieses Signal mit der wait-Funktion ab, um die ID des beendeten Kindprozesses und den Beendigungsstatus dieses Kindprozesses zu erfahren. Dieses Sifnal loest somit das obsolete Signal SIGCLD von frueheren UNIX-Versionen ab.

SIGCONT

Dieses Signal wird an einen angehaltenen Prozess geschickt, wenn er seine Ausfuehrung vortsetzen soll. Wird dieses Signal an einen nicht angehaltenen Prozess geschickt, so wird es von diesem ignoriert. Einige Editoren fangen dieses Signal ab und frischen das Terminal-Fenster auf, wenn sie wieder gestartet - also in den Vordergrund gebracht - werden.

SIGEMT

Dieses Signal wird bei einem Hardwarefehler (implementierungsdefiniert) geschickt. EMT stammt uebrigens von emulator trap der PDP-11 ab.

SIGFPE

Dieses Signal wird bei einem arithmetischen Fehler, wie z. B. Division durch 0 (Null) oder Overflow, geschickt (FPE steht fuer floating point error).

SIGHUP

Dieses Signal wird dem Kontrollprozess (Sessionfuehrer) eines Terminals geschickt, wenn eine Verbindung zum Terminal unterbrochen wird. Der Kontrollprozess ist dabei der Prozess, auf den die Komponente s_leader der session-Struktur zeigt. SIGHUP wird auch geschickt, wenn der Kontrollprozess (session leader) beendet wird; in diesem Fall wird das Signal an jeden Prozess geschickt, der momentan im Vordergrund arbeitet. Ueblicherweise wird dieses Signal benutzt, um Daemonprozesse zu veranlassen, ihre Logdateien zu schliessen und neu zu oeffnen, sowie ihre Konfigurationsdateien erneut einzulesen. SIGHUP ist hierfuer besonders gut geeignet, da ein Daemonprozess ueblicherweise kein Kontrollterminal besitzt und deshalb dieses Signal normalerweise nicht empfangen wuerde.

SIGKILL

Dieses Signal zeigt an, dass der Prozess einen illegalen Hardwarebefehl ausgefuehrt hat.

SIGINFO

Dieses Signal wird in BSD-Unix generiert, wenn die Statusanforderungstaste (normalerweise Strg-T) gedrueckt wird. Dieses Signal wird bei allen Prozessen geschickt, die momentan im Vordergrund arbeiten und es bewirkt, dass Statusinformationen ueber alle diese Prozesse am Terminal ausgegeben werden.

SIGINT"

Dieses Signal wird allen Prozessen geschickt, die momentan im Vordergrund arbeiten, wenn die Unterbrechungstaste (DELETE oder Strg-C) gedrueckt wird.

SIGIO

Dieses Signal zeigt asynchrone E/A-Anforderungen an. In SVR4 ist dieses Signal identisch zum Signal SIGPOLL und die Default-Aktion ist dort die Beendigung des Prozesses. In BSD-Unix ist die Default-Aktion das Ignorieren dieses Signals.

SIGIOT

Dieses Signal zeigt einen implementierungsspezifischen Hardwarefehler an. IOT steht dabei fuer Input/Output-Trap und der stammt ebenfalls von PDP-11 ab.

SIGKILL

Dieses Signal beendet den Prozess an den es geschickt wird, in jedem Fall, da es niemals abgefangen oder ignoriert werden kann.

SIGPIPE

Dieses Signal wird einem in eine Pipe schreibenend Prozess geschickt, wenn der aus der Pipe lesende Prozess sich vorzeitig beendet. Diese Situation wird mit broken pipe bezeichnet.

SIGPOLL

Dieses Signal zeigt an, dass ein spezielles Ereigniss an einem waehlbaren Geraet aufgetreten ist. Unter *BSD-Unix sind die Signale SIGIO und SIGURG mit diesem Signal vergleichbar.

SIGPROF

Dieses Signal wird geschickt, wenn eine Profiling-Zeitschaltuhr, die mit der Funktion setitimer (setitimer(2)) eingestellt wurde, abgelaufen ist.

SIGPWR

Dieses Signal wird unter SVR4 nur in Systemen angeboten, die ueber eine nicht unterbrechbare Stromversorgung verfuegen. In solchen Systemen wird dieses Signal ueblicherweise geschickt, wenn nach einem Stromausfall auf Batterie umgeschaltet wurde und diese beginnt, an Ladung zu verlieren. Die meisten Systeme sind so konfiguriert, dass dieses Signal dem init-Prozess geschickt wird, welcher daraufhin ein shutdown des Systems veranlasse. Viele SVR4-Implementierungen von init stellen dazu in der Datei inittab die Eintrage powerfail und powerwait zur Verfuegung.

SIGQUIT

Dieses Signal wird allen Prozessen geschickt, die momentan im Vordergrund arbeiten, wenn die Unterbrachungstaste (meist Strg-\) gedrueckt wird. SIGQUIT verhaelt sich wie SIGINT, legt jedoch eine core-Datei an.

SIGSEGV

Dieses Signal zeigt an, dass der Prozess versuchte, auf eine unerlaubte Adresse im Speicher zuzugreifen (Lesen oder Schreiben). SEGV ist die Abkuerzung von segmentation violation.

SIGSTOP

Dieses Signal haelt einen Prozess an. Das Signal SIGSTOP ist zwar dem interaktiven Terminalstoppsignal SIGTSTP aehnlich, kann aber nicht wie dieses abgefangen oder ignoriert werden.

SIGSYS

Dieses Signal zeigt an, dass ein unerlaubter Systemaufruf stattfand. Dieser liegt dann vor, wenn ein Prozess einen Maschinenbefehl ausfuehrt, den der Kern faelschlicherweise als Systemaufruf interpretiert und diesen Fehler dann erst bei den falschen oder fehlenden Argumenten erkennt.

SIGTERM

Dieses Signal ist das voreingestellte Signal, dass das kill-Kommando einem Prozess schickt, dem es mitteilen moechte, dass er sich beenden soll.

SIGTRAP

Dieses Signal zeigt einen implementierungsdefinierten Hardware-Fehler an. Wenn die Ausfuehrung eines Prozesses auf einen Breakpoint trifft, wird dieses Signal an den Prozess geschickt. Es wird gewoehnlich von einem Debugger abgefangen, der den Breakpoint gesetzt hat.

SIGTSTP

Dieses Signal wird allen Prozessen geschickt, die Momentan im Vordergrund arbeiten, wenn die Terminalstopptaste (meist Strg-Z) gedrueckt wird.

SIGTTIN

Dieses Signal wird generiert, wenn ein Hintergrundprozess versucht, von einem Kontrollterminal zu lesen. SIGTTIN wird nicht generiert, wenn der lesende Prozess dieses Signal ignoriert oder blockiert oder aber die Prozessgruppe des lesenden Prozesses verwaist ist. In diesen Spezialfaellen fuehrt die Leseoperation zu einem Fehler, wobei die Variable errno auf EIO gesetzt wird.

SIGTTOU

Dieses Signal verhaelt sich aehnlich wie das Signal SIGTTIN, jedoch mit einem Unterschied. Anders als beim Signal SIGTTIN kann ein Hintergrundprozess das Schreibe jedoch zulassen oder auch verbieten. Ist Schreiben durch einen Hintergrundprozess erlaubt, so gelten die beiden genannten Spezialfaellt nicht!. Neben den Schreiboperationen kann dieses Signal SIGTTOU auch von den Terminalroutinen tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow und tcsetpgrp generiert werden.

SIGURG

Dieses Signal zeigt an, dass ein dringendes Ereignis eingetreten ist, auf das sofort reagiert werden muss. Solche dringende Ereignisse treten zum Beispiel bei Netzwerkverbindungen auf.

SIGUSR1

Dieses benutzerdefinierte Signal ist fuer die Verwendung in Anwenderprogrammen reserviert.

SIGUSR2

Dieses benutzerdefinierte Signal ist ebenfalls fuer die Verwendung in Anwenderprogrammen reserviert.

SIGVTALRM

Dieses Signal zeigt an, dass eine zuvor mit der Funktion setitimer eingerichtetet Zeitschaltuhr abgelaufen ist.

SIGWINCH

Dieses Signal wird allen Vordergrundprozessen geschickt, die einem Terminal oder Pseudoterminal zugeordnert sind, wenn die Fenstergroesse dieses Terminals mit der ioctl-Funktion geaendert wird.

SIGXCPU

Dieses Signal wird Prozessen geschickt, die das fuer sie festgelegte CPU-Zeitlimit ueberschreiten.

SIGXFSZ

Dieses Signal wird Prozessen geschickt, die das fuer sie festgelegte Dateigroessenlimit ueberschreiten.

sis_siglist - Signalbeschreibungen

Einige Systeme (wie BSD und SVR4) stellen folgendes Array zur Verfuegung

extern char *sys_siglist[];

Dieses Array enthaelt Kurzbeschreibungen zu allen Signalen. Als Arrayindex ist dabei die Signalnummer anzugeben. Daneben stellen diese Systeme normalerweise die Funktion psignal zr Verfuegung.

#include <signal.h>

void psignal(int signr, const char *string);

Diese Funktion psignal ist aehnlich zur Funktion perror. Sie gibt den angegebenen string (normalerweise der Programmname) auf die Standardfehlerausgabe aus. Danach gibt sie einen Doppelpunkt mit Leerzeichen aus, bevor sie eine kurze Beschreibung des Signals, gefolgt von einem Neue-Zeile-Zeichen ausgibt.

Das folgende Programm gibt eine Kurzbeschreibung zu den ersten 10 Signalen einmal mit psignal und einmal mit sys_siglist aus.

#include <signal.h>
#include <stdio.h>
int
main(void)
{
    int   i;
    char  text[10];

    fprintf(stderr, "Die Ausgabe mit psignal:\n");
    for (i=1; i<=10; i++) {
        sprintf(text, "%2d", i);
        psignal(i, text);
    } //for (i=1; i<=10; i++)

    fprintf(stderr, "\n");
    fprintf(stderr, "Die Ausgabe mit sys_siglist:\n");
    for (i=1; i<=10; i++) {
        sprintf(text, "%2d", i);
        fprintf(stderr, "%s: %s\n", text, sys_siglist[i]);
    } //for (i=1; i<=10; i++)

    exit(0);
} //

Nachdem es kompiliert wurde, ergibt sich beim Aufruf folgender Ablauf:

$ cc -o fnord fnord.c
$ ./fnord
Die Ausgabe mit psignal:
 1: Hangup
 2: Interrupt
 3: Quit
 4: Illegal instruction
 5: Trace/breakpoint trap
 6: Aborted
 7: Bus error
 8: Floating point exception
 9: Killed
10: User defined signal 1

Die Ausgabe mit sys_siglist:
 1: Hangup
 2: Interrupt
 3: Quit
 4: Illegal instruction
 5: Trace/breakpoint trap
 6: Aborted
 7: Bus error
 8: Floating point exception
 9: Killed
10: User defined signal 1