exit - ein normales Prozessende veranlassen
Standard-C-Bibliothek (
libc,
-lc)
#include <stdlib.h>
[[noreturn]] void exit(int status);
Die Funktion
exit() veranlasst ein normales Prozessende und gibt das
niederwertigste Byte von
status (d.h.
status & 0xFF) an den
Elternprozess zurück (siehe
wait(2)).
Die mit
atexit(3) und
on_exit(3) registrierten Funktionen werden
in der umgekehrten Reihenfolge ihrer Registrierung aufgerufen. (Eine solche
Funktion kann
atexit(3) oder
on_exit(3) aufrufen, um eine
zusätzliche Funktion zu registrieren, die während des
Exit-Prozesses ausgeführt wird; die neue Registrierung wird am Anfang
der Liste verbleibender Funktionen hinzugefügt, die noch aufgerufen
werden.) Wenn eine dieser Funktionen nicht zurückkehrt (z.B. wenn sie
_exit(2) aufruft oder sich selbst mit einem Signal beendet), dann wird
keine der verbleibenden Funktionen aufgerufen und die weitere
Exit-Ausführung (insbesondere Leeren von
stdio(3)-Datenströmen) wird abgebrochen. Falls eine Funktion
mehrmals mit
atexit(3) oder
on_exit(3) registriert wurde, dann
wird sie so oft aufgerufen, wie sie registriert wurde.
Alle offenen
stdio(3)-Datenströme werden geleert und geschlossen.
Durch
tmpfile(3) erzeugte Dateien werden entfernt.
Der C-Standard spezifiziert zwei Konstanten,
EXIT_SUCCESS und
EXIT_FAILURE, die an
exit() übergeben werden und ein
erfolgreiches beziehungsweise erfolgloses Beenden anzeigen.
Die Funktion
exit() kehrt nichts zurück.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
exit() |
Multithread-Fähigkeit |
MT-Unsafe race:exit |
Die Funktion
exit() verwendet eine globale Variable, die nicht
geschützt ist, daher ist sie nicht multithread-fähig.
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Das Verhalten ist undefiniert, wenn eine der mit
atexit(3) und
on_exit(3) registrierten Funktionen
exit() oder
longjmp(3) aufruft. Beachten Sie, dass ein Aufruf von
execve(2)
die mittels
atexit(3) und
on_exit(3) erstellten Registrierungen
entfernt.
EXIT_SUCCESS und
EXIT_FAILURE zu benutzen ist etwas portierbarer
(auf Nicht-UNIX-Umgebungen), als 0 und einen Wert ungleich Null wie 1 oder -1
zu verwenden. Insbesondere VMS hat andere Konventionen.
BSD versuchte, die Exit-Codes zu standardisieren (was durch einige
C-Bibliotheken wie die GNU-C-Bibliothek auch übernommen wurde); siehe
die Datei
<sysexits.h>.
Nach
exit() muss der Exit-Status an den Elternprozess übertragen
werden. Es gibt drei Fälle:
- •
- Falls der Elternprozess SA_NOCLDWAIT oder den
Handler SIGCHLD auf SIG_IGN gesetzt hat, wird der Status
verworfen und das Kind stirbt sofort.
- •
- Falls der Elternprozess auf das Kind wartete, wird er
über den Exit-Status benachrichtigt und das Kind stirbt
sofort.
- •
- Andernfalls wird das Kind ein
»Zombie«-Prozess: die meisten der Ressourcen des Prozessen
werden neu genutzt, aber eine Position, die minimale Informationen
über den Kindprozess (Beendigungstatus,
Ressourcenverwendungsstatistik) enthält, wird in der Prozesstabelle
beibehalten. Dies erlaubt es Elternprozessen, nachfolgend
waitpid(2) (oder ähnliches) zu verwenden, um den
Beendigungsstatus des Kindprozesses zu erfahren; zu diesem Zeitpunkt wird
die Zombiprozessposition freigegeben.
Wenn die Implementation das Signal
SIGCHLD unterstützt, wird
dieses Signal an den Elternprozess gesandt. Falls der Elternprozess
SA_NOCLDWAIT gesetzt hat, ist nicht definiert, ob ein
SIGCHLD
gesandt wird.
Falls der beendende Prozess der führende Prozess der Sitzung ist und sein
steuerndes Terminal das steuernde Terminal der Sitzung ist, dann wird jedem
Prozess in der Vordergrund-Prozessgruppe dieses steuernden Terminals ein
SIGHUP-Signal gesandt und das Terminal wird von dieser Sitzung
gelöst, was ermöglicht, dass es von einem neuen steuernden
Prozess übernommen wird.
Falls das Beenden des Prozesses das Verwaisen einer Prozessgruppe verursacht und
jedes Mitglied der neu verwaisten Gruppe gestoppt wird, dann wird ein
SIGHUP-Signal gefolgt von einem
SIGCONT-Signal an jeden Prozess
in dieser Prozessgruppe gesandt. Lesen Sie
setpgid(2), wenn Sie eine
Erläuterung verwaister Prozessgruppen suchen.
Außer in den obigen Fällen, bei denen der signalisierte Prozess
ein Kind des beendenden Prozesses sein könnte, führt das Beenden
von Prozesse im allgemeinen
nicht dazu, dass ein Signal an die Kinder
des Prozesses gesandt wird. Allerdings kann ein Prozess die Aktion
prctl(2) PR_SET_PDEATHSIG verwenden, damit es ein Signal
bekommt, wenn sein Elternprozess sich beendet.
_exit(2),
get_robust_list(2),
setpgid(2),
wait(2),
atexit(3),
on_exit(3),
tmpfile(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Stefan Janke
<
[email protected]>, Chris Leick
<
[email protected]> und Helge Kreutzmann <
[email protected]>
erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer