exit, atexit, unatexit, _exit oder _Exit-Subroutine
Zweck
Beendet einen Prozess.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
Beschreibung
Die Subroutine Exit beendet den aufrufenden Prozess, nachdem die _bereinigen -Funktion der Standard-E/A-Bibliothek aufgerufen wurde, um alle gepufferten Ausgaben zu löschen. Außerdem werden alle Funktionen aufgerufen, die zuvor von der Subroutine Atexit für den Prozess registriert wurden. Die Subroutine Atexit registriert Funktionen, die bei normaler Prozessbeendigung aufgerufen werden, für die Bereinigung. Die normale Beendigung erfolgt als Ergebnis eines Aufrufs der Subroutine Exit oder einer Anweisung Rückgabe in der Funktion Hauptfenster .
Jede Funktion, die ein Aufruf an die Atexit -Subroutinenregister zurückgeben muss. Diese Aktion stellt sicher, dass alle registrierten Funktionen aufgerufen werden.
Schließlich ruft die Subroutine Exit die Subroutine _beenden auf, die die Beendigung des Prozesses beendet und nicht zurückgegeben wird. Die Subroutine _beenden beendet den aufrufenden Prozess und führt zu Folgendem:
Die Subroutine _Beenden ist funktional äquivalent zur Subroutine _beenden . Die Subroutine _Beenden ruft keine Funktionen auf, die bei Atexit oder registrierten Signalhandlern registriert sind. Die Art und Weise, wie die Subroutine implementiert wird, bestimmt, ob geöffnete Datenströme gelöscht oder geschlossen werden und ob temporäre Dateien entfernt werden. Der aufrufende Prozess wird mit den unten beschriebenen Folgen beendet.
- Alle Dateideskriptoren, Verzeichnisdatenströme, Konvertierungsdeskriptoren und Nachrichtenkatalogdeskriptoren, die im aufrufenden Prozess geöffnet sind, werden geschlossen.
- Wenn der übergeordnete Prozess des aufrufenden Prozesses ein Warten oder Waitpidausführt und sein Flag SA_NOCLDWAIT nicht gesetzt oder SIGCHLD auf SIG_IGN gesetzt hat, wird er über die Beendigung des aufrufenden Prozesses benachrichtigt und die niedrigstwertigen acht Bit (d. h. Bit 0377) von Status werden ihm zur Verfügung gestellt. Wenn das übergeordnete Element nicht wartet, wird ihm der Status des untergeordneten Elements zur Verfügung gestellt, wenn das übergeordnete Element anschließend Warten oder Waitpidausführt.
- Wenn der übergeordnete Prozess des aufrufenden Prozesses keine Warten oder Waitpidausführt und weder das Flag SA_NOCLDWAIT noch SIGCHLD auf SIG_IGN gesetzt hat, wird der aufrufende Prozess in einen Geisterprozess umgewandelt. Ein Geisterprozess ist ein inaktiver Prozess, der zu einem späteren Zeitpunkt gelöscht wird, wenn sein übergeordneter Prozess Warten oder Waitpidausführt.
- Die Beendigung eines Prozesses beendet seine untergeordneten Prozesse nicht direkt. Durch das Senden eines SIGHUP-Signals werden untergeordnete Elemente unter bestimmten Umständen indirekt beendet. Dies kann auf eine von zwei Arten erfolgen. Wenn die Implementierung das Signal SIGCHLD unterstützt, wird eine SIGCHLD an den übergeordneten Prozess gesendet. Wenn der übergeordnete Prozess das Flag SA_NOCLDWAIT gesetzt oder SIGCHLD auf SIG_IGN gesetzt hat, wird der Status gelöscht und die Lebensdauer des aufrufenden Prozesses sofort beendet. Wenn SA_NOCLDWAIT gesetzt ist, ist die Implementierung definiert, ob ein SIGCHLD-Signal an den übergeordneten Prozess gesendet wird.
- Die übergeordnete Prozess-ID aller vorhandenen untergeordneten Prozesse und Geisterprozesse des aufrufenden Prozesses wird auf die Prozess-ID eines implementierungsdefinierten Systemprozesses gesetzt.
- Jedes zugeordnete gemeinsam genutzte Speichersegment wird abgehängt und der Wert von 'shm_nattch' (siehe Shmget) in der Datenstruktur, die seiner gemeinsam genutzten Speicher-ID zugeordnet ist, wird um 1 verringert.
- Für jedes Semaphor, für das der aufrufende Prozess einen Semadj -Wert festgelegt hat (siehe Semop), wird dieser Wert zum Semval des angegebenen Semaphors hinzugefügt.
- Wenn der Prozess ein steuernder Prozess ist, wird das SIGHUP-Signal an jeden Prozess in der Vordergrundprozessgruppe des zu dem aufrufenden Prozess gehörenden Steuerterminals gesendet.
- Wenn es sich bei dem Prozess um einen steuernden Prozess handelt, wird die Zuordnung des Steuerterminals, das der Sitzung zugeordnet ist, zur Sitzung aufgehoben, sodass es von einem neuen steuernden Prozess angefordert werden kann.
- Wenn der Exit des Prozesses dazu führt, dass eine Prozessgruppe verwaist wird, und wenn ein Mitglied der neu verwaisten Prozessgruppe gestoppt wird, wird ein Signal SIGHUP gefolgt von einem Signal SIGCONT an jeden Prozess in der neu verwaisten Prozessgruppe gesendet.
- Alle offenen benannten Semaphore im aufrufenden Prozess werden wie durch entsprechende Aufrufe an Sem_closegeschlossen.
- Speicherzuordnungen, die im Prozess erstellt wurden, werden aufgehoben, bevor der Prozess gelöscht wird.
- Alle Blöcke des typisierten Speichers, die im aufrufenden Prozess zugeordnet wurden, werden nicht zugeordnet, als ob die Subroutine munmap implizit aufgerufen wurde, um die Zuordnung aufzuheben.
- Alle offenen Nachrichtenwarteschlangendeskriptoren im aufrufenden Prozess werden geschlossen.
- Alle ausstehenden abbrechbaren asynchronen E/A-Operationen können abgebrochen werden. Diese asynchronen E/A-Operationen, die nicht abgebrochen werden, werden beendet, als wäre die Subroutine _Beenden noch nicht aufgetreten, aber alle zugehörigen Signalbenachrichtigungen werden unterdrückt.
Die Subroutine _Beenden wartet möglicherweise auf einen solchen E/A-Abschluss. Die Implementierung definiert, ob eine Ein-/Ausgabe abgebrochen wird und welche Ein-/Ausgabe unter _Beendenabgebrochen werden kann.
- Threads, die durch einen Aufruf von _Beenden beendet wurden, rufen weder ihre Bereinigungshandler für den Abbruch noch die Destruktoren für Threaddaten auf.
- Wenn der aufrufende Prozess ein Trace-Controller-Prozess ist, werden alle Tracedatenströme, die vom aufrufenden Prozess erstellt wurden, beendet.
Die Subroutine Unatexit wird zum Aufheben der Registrierung von Funktionen verwendet, die zuvor von der Subroutine Atexit registriert wurden. Wenn die referenzierte Funktion gefunden wird, wird sie aus der Liste der Funktionen entfernt, die bei normaler Programmbeendigung aufgerufen werden.
Parameter
| Element | Beschreibung |
|---|---|
| Status | Gibt den Status des Prozesses an Kann auf 0, EXIT_SUCCESS, EXIT_FAILURE oder einen anderen Wert gesetzt werden, obwohl nur die niedrigstwertigen 8 Bit für einen wartenden übergeordneten Prozess verfügbar sind. |
| Funktion | Gibt eine Funktion an, die bei normaler Prozessbeendigung zur Bereinigung aufgerufen werden soll. Sie können eine Reihe von Funktionen für den Grenzwert angeben, der von der Funktion ATEXIT_MAX festgelegt wird, die in der Datei sys/limits.h definiert ist. Ein Pushdown-Stapel von Funktionen wird beibehalten, sodass die letzte registrierte Funktion die erste aufgerufene Funktion ist. |
Rückgabewerte
Nach erfolgreicher Beendigung gibt die Subroutine Atexit den Wert 0 zurück. Andernfalls wird ein Wert ungleich null zurückgegeben. Die Subroutinen Exit und _beenden geben keinen Wert zurück.
Die Subroutine unatexit () gibt den Wert 0 zurück, wenn die von Funktion referenzierte Funktion gefunden und aus der Liste Atexit entfernt wird. Andernfalls wird ein Wert ungleich null zurückgegeben.