Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

exit, _exit, _Exit - Prozess beenden

&pagelevel(4)&pagelevel

Definition

#include <stdlib.h>

nicht C11
void exit (int status); (Ende)
C11
_Noreturn void exit (int status);
_Noreturn void _Exit (int status); (Ende)

#include <unistd.h>

void _exit (int status);

Beschreibung

_exit(), _Exit() und exit() beenden den aufrufenden Prozess.

_Exit ist äquivalent zu _exit.

Bei einem exit-Aufruf werden folgende Aktionen ausgelöst:

  1. exit() ruft alle Funktionen auf, die durch atexit() registriert wurden, und zwar in der umgekehrten Reihenfolge ihrer Registrierung. Wenn eine von atexit() registrierte Funktion nicht zurückkehrt, werden keine weiteren registrierten Funktionen mehr aufgerufen, und die Ausführung von exit() wird abgebrochen. Wenn exit() mehr als einmal aufgerufen wird, ist das Verhalten nicht definiert.

  2. exit() leert alle Ausgabeströme, schließt alle Datenströme und löscht alle Dateien, die von tmpfile() erzeugt wurden.

Mit _exit() werden im Unterschied zu exit() die mit atexit() registrierten Prozessendefunktionen nicht aufgerufen und geöffnete Dateien nicht geschlossen.

_exit() und exit() beenden den aufrufenden Prozess mit den folgenden Konsequenzen:

  • Alle Dateideskriptoren, Dateiverzeichnisströme, Umwandlungsdeskriptoren und Mel-dungskatalog-Deskriptoren, die für den aufrufenden Prozess offen sind, werden geschlossen.

  • Wenn der Vaterprozess des aufrufenden Prozesses wait() oder waitpid() ausführt, wird dieser von der Beendigung des aufrufenden Prozesses benachrichtigt und die niederwertigen 8 Bit von status, d.h. die Bits 0377, werden ihm verfügbar gemacht (siehe auch wait() und waitpid()).

  • Wenn der Vaterprozess nicht wartet und anschließend wait() oder waitpid() ausführt, wird ihm der Status des Sohnprozesses verfügbar gemacht.

  • Wenn der Vaterprozess des aufrufenden Prozesses kein wait() oder waitpid() ausführt, wird der aufrufende Prozess in einen so genannten Zombieprozess umgewandelt. Ein Zombieprozess ist ein inaktiver Prozess; er wird zu einem späteren Zeitpunkt gelöscht, nämlich wenn sein Vaterprozess wait() oder waitpid() ausführt.

  • Die Beendigung eines Prozesses beendet nicht unmittelbar dessen Sohnprozesse. Das Senden des Signals SIGHUP beendet, wie unten beschrieben, Sohnprozesse indirekt unter bestimmten Umständen.

  • Im POSIX-Subsystem wird zusätzlich das Signal SIGCHLD an den Vaterprozess des aufrufenden Prozesses gesendet. Andere X/Open-kompatible Systeme können für diesen Fall andere Vorgaben definieren.

  • Die Vaterprozessnummer aller existierenden Sohn- oder Zombieprozesse des aufrufenden Prozesses wird gleich der Prozessnummer eines speziellen Systemprozesses gesetzt. Das heißt, diese Prozesse werden von dem Systemprozess init geerbt, dessen Prozessnummer gleich 1 ist.

  • Jedes angehängte Segment des gemeinsam nutzbaren Speichers wird abgehängt, und der Wert von shm_nattch (siehe shmget()) in der Datenstruktur, die seiner Nummer für gemeinsam nutzbaren Speicher zugeordnet ist, wird um 1 dekrementiert.

  • Für jedes Semaphor, für das der aufrufende Prozess einen semadj-Wert gesetzt hat (siehe auch semop()), wird dieser Wert zum semval des angegebenen Semaphors addiert.

  • Wenn der Prozess ein steuernder Prozess ist, wird das Signal SIGHUP an jeden Prozess in der Vordergrundprozessgruppe des steuernden Terminals gesendet, das zu dem aufrufenden Prozess gehört.

  • Wenn der Prozess ein steuernder Prozess ist, wird das steuernde Terminal, das dieser Sitzung zugeordnet ist, wieder freigegeben, wodurch es von einem neuen steuernden Prozess belegt werden kann.

  • Wenn durch das Prozessende eine Prozessgruppe verwaist und ein Mitglied der frisch verwaisten Prozessgruppe angehalten wird, wird erst das Signal SIGHUP und dann das Signal SIGCONT an jeden Prozess der frisch verwaisten Prozessgruppe gesendet.

Die Symbole EXIT_SUCCESS und EXIT_FAILURE sind in stdlib.h definiert und können als Wert von status verwendet werden, um erfolgreiches oder nicht erfolgreiches Beenden anzuzeigen.

exit() und _exit() kehren nicht zurück.

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus:

  • Beenden des Prozesses. Threads, die durch einen Aufruf von _exit() beendet werden, rufen nicht ihre cancellation cleanup handler oder die Daten-Destruktoren des Threads auf.

BS2000

  • Die Monitor-Jobvariable MONJV wird nach folgenden Regeln versorgt:
  • Je nach Wert des Parameters status wird die Zustandsanzeige der Monitor-Jobvariablen MONJV (1. - 3. Byte) auf den Wert "$T " oder "$A " gesetzt, und es werden die Variablen SUBCODE1, SUBCODE2 und MAINCODE, die mit den gleichnamigen vordefinierten Funktionen von SDF-P abgefragt werden können, versorgt.

status kann die in der Include-Datei stdlib.h definierten symbolischen Konstanten EXIT_SUCCESS und EXIT_FAILURE oder einen beliebigen integer-Wert enthalten:

EXIT_SUCCESS (Wert 0)

verursacht eine normale Programmbeendigung.

Die Zustandsanzeige der MONJV bekommt den Wert "$T " zugewiesen. Außerdem werden SUBCODE1=0, MAINCODE =CCM0998 und SUBCODE2=status modulo 256 gesetzt.

EXIT_FAILURE (Wert 9990888)

verursacht eine so genannte Jobstep-Beendigung:

  • Das Programm wird anormal beendet.

  • In einer DO- oder CALL-Prozedur verzweigt das System zum nächsten Kommando ABEND, END-PROCEDURE, SET-JOB-STEP oder LOGOFF.

  • Es erfolgt die Systemmeldung "ABNORMAL PROGRAM TERMINATION".

Die Zustandsanzeige der MONJV bekommt den Wert "$A " zugewiesen. Außerdem werden SUBCODE1=64, MAINCODE=CCM0999 und SUBCODE2=status modulo 256 gesetzt.

integer-Wert != 0 bzw. != 9990888

eine Jobstep-Beendigung wird durchgeführt, und die Zustandsanzeige der MONJV bekommt den Wert "$T" zugewiesen. Außerdem werden SUBCODE1=64, MAINCODE=CCM0999 und SUBCODE2=status modulo 256 gesetzt.

Enspricht dieser Wert den vordefinierten Werten EXIT_SUCCESS oder EXIT_FAILURE, werden die oben genannten Aktionen durchgeführt. (Ende)

Hinweise

Normalerweise sollten Anwendungen exit() an Stelle von _exit() verwenden.

Funktionen, die durch at_quick_exit() registriert wurden, werden nicht aufgerufen.

BS2000

Um Monitor-Jobvariablen versorgen und abfragen zu können, müssen Sie das C-Programm von der BS2000-Oberfläche aus mit folgendem Kommando starten:

/START-PROG programm,MONJV=monjvname

Der Inhalt der Jobvariablen lässt sich dann z.B. mit folgendem Kommando abfragen:

/SHOW-JV JV-NAME(monjvname)

Weitere Informationen zur Ablaufüberwachung mit Monitor-Jobvariablen finden Sie im Handbuch "JV (BS2000)". (Ende)

Siehe auch

abort(), atexit()at_quick_exit(), bs2exit(), close(), fclose()quick_exit(), semop(), shmget(), sigaction(), wait(), stdlib.h, unistd.h.