$ integer i=0 ;print -c ${(e)signals//*/\$((i++))\) SIG\$signals[\$i]}
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 Datei core kann dem meisten Unix-Debuggern vorgelegt werden, um nachtraeglich den Zustand des Prozesses zum Zeitpunkt seiner Beendigung zu untersuchen. Es gibt auch Ausnahmefaellt, in denen kein SPeicherabbild in der Datei core hinterlegt wird; das sind u. a. folgende:
Wenn der Prozess mit Set-User-ID-Bit lief und der Aufrufer nicht der Besitzer der Programmdatei ist.
Wenn der Prozess mit Set-Group-ID-Bit lief und der Aufrufer nicht der Gruppeneigentuemer der Programmdatei ist.
Wenn der Benutzer keine Schreibrechte im aktuellen Working-Directory hat.
Wenn die Datei core zu gross ist.
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. |
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.
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.
Dieses Signal wird bei einem Hardwarefehler (implementierungsdefiniert) geschickt.
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.
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.
Dieses Signal wird bei einem Hardwarefehler (implementierungsdefiniert) geschickt. EMT stammt uebrigens von emulator trap der PDP-11 ab.
Dieses Signal wird bei einem arithmetischen Fehler, wie z. B. Division durch 0 (Null) oder Overflow, geschickt (FPE steht fuer floating point error).
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.
Dieses Signal zeigt an, dass der Prozess einen illegalen Hardwarebefehl ausgefuehrt hat.
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.
Dieses Signal wird allen Prozessen geschickt, die momentan im Vordergrund arbeiten, wenn die Unterbrechungstaste (DELETE oder Strg-C) gedrueckt wird.
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.
Dieses Signal zeigt einen implementierungsspezifischen Hardwarefehler an. IOT steht dabei fuer Input/Output-Trap und der stammt ebenfalls von PDP-11 ab.
Dieses Signal beendet den Prozess an den es geschickt wird, in jedem Fall, da es niemals abgefangen oder ignoriert werden kann.
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.
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.
Dieses Signal wird geschickt, wenn eine Profiling-Zeitschaltuhr, die mit der Funktion setitimer (setitimer(2)) eingestellt wurde, abgelaufen ist.
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.
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.
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.
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.
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.
Dieses Signal ist das voreingestellte Signal, dass das kill-Kommando einem Prozess schickt, dem es mitteilen moechte, dass er sich beenden soll.
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.
Dieses Signal wird allen Prozessen geschickt, die Momentan im Vordergrund arbeiten, wenn die Terminalstopptaste (meist Strg-Z) gedrueckt wird.
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.
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.
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.
Dieses benutzerdefinierte Signal ist fuer die Verwendung in Anwenderprogrammen reserviert.
Dieses benutzerdefinierte Signal ist ebenfalls fuer die Verwendung in Anwenderprogrammen reserviert.
Dieses Signal zeigt an, dass eine zuvor mit der Funktion setitimer eingerichtetet Zeitschaltuhr abgelaufen ist.
Dieses Signal wird allen Vordergrundprozessen geschickt, die einem Terminal oder Pseudoterminal zugeordnert sind, wenn die Fenstergroesse dieses Terminals mit der ioctl-Funktion geaendert wird.
Dieses Signal wird Prozessen geschickt, die das fuer sie festgelegte CPU-Zeitlimit ueberschreiten.
Dieses Signal wird Prozessen geschickt, die das fuer sie festgelegte Dateigroessenlimit ueberschreiten.
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