Verwendung der exit-Funktion in C
-
Verwendung von die Funktion
exit
zum Beenden eines Prozesses in C -
Verwendung der Funktion
atexit
zur Registrierung eines Exit-Handlers in C
Dieser Artikel demonstriert mehrere Methoden, wie man die exit-Funktion in C verwenden kann.
Verwendung von die Funktion exit
zum Beenden eines Prozesses in C
Wenn ein bestimmtes Programm auf einem UNIX-basierten Betriebssystem läuft, nennt man es einen Prozess. Der Prozess kann ein langlaufendes Programm im Stil eines Daemons oder ein einfaches Kommandozeilenprogramm sein, aber beide kommen irgendwann an den Punkt, an dem sie beendet werden. Die Beendigung kann abnormal sein, verursacht durch einen Fehler oder ein Signal, oder der Prozess selbst kann als normales Verhalten durch den Aufruf der Bibliotheksfunktion exit
beendet werden. Sie nimmt ein einzelnes Integer-Argument entgegen, das den Beendigungswert angibt, der an den Elternprozess zurückgegeben wird. Beachten Sie, dass die Funktion exit
nicht in den aufrufenden Prozess zurückkehrt.
Die Funktion exit
ist die Standard-Bibliotheksfunktion, die auf dem Systemaufruf _exit
aufbaut (den wir in den nächsten Abschnitten besprechen werden). Dennoch führt sie mehr Operationen aus, als nur den Aufrufer zum Beendigungspunkt zu führen. Nämlich führt _exit
einige Aufräumarbeiten für das Programm durch, wie z. B. das Aufrufen von Exit-Handlern, das Flushen von Standard-I/O-Stream-Puffern, und erst dann wird _exit
aufgerufen. Beachten Sie, dass _exit
ein UNIX-spezifischer Systemaufruf ist, während exit
Teil der Standard-C-Bibliothek ist und auf verschiedenen Plattformen verwendet werden kann.
Das folgende Beispiel demonstriert den Funktionsaufruf exit
mit dem Statusparameter EXIT_SUCCESS
, einer Makrokonstante mit dem Wert 0
, die üblicherweise eine erfolgreiche Rückkehr kennzeichnet.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
// Execute program code here
printf("Executing the program...\n");
sleep(5);
// exit(0);
exit(EXIT_SUCCESS);
}
Ausgabe:
Executing the program...
Verwendung der Funktion atexit
zur Registrierung eines Exit-Handlers in C
Die Funktion atexit
wird verwendet, um Exit-Handler zu registrieren, die lediglich benutzerimplementierte Funktionen sind, die aufgerufen werden sollen, wenn der Prozess mit dem Aufruf exit
beendet wird. atexit
nimmt als einziges Argument einen Funktionszeiger vom Typ void (*function)(void)
.
Beachten Sie, dass mehrere Funktionen durch mehrere atexit
-Aufrufe registriert werden können, was zur Ausführung der angegebenen Funktionen in umgekehrter Reihenfolge der Registrierung führt. atexit
gibt einen Wert ungleich Null zurück, wenn der Aufruf fehlschlägt. Beachten Sie, dass registrierte Funktionen möglicherweise nicht aufgerufen werden, wenn der Prozess durch ein externes Signal abnormal beendet wird. Der nächste Beispielcode implementiert zwei static
-Funktionen, die als Exit-Handler registriert werden, und nach 5 Sekunden Schlaf wird der Prozess mit einem exit
-Aufruf beendet.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void atexitFunc(void) { printf("atexitFunc called\n"); }
static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }
int main(int argc, char *argv[]) {
if (atexit(atexitFunc) != 0) {
perror("atexit");
exit(EXIT_FAILURE);
}
if (atexit(atexitFunc2) != 0) {
perror("atexit");
exit(EXIT_FAILURE);
}
printf("Executing the program...\n");
sleep(5);
exit(EXIT_SUCCESS);
}
Ausgabe:
Executing the program...
atexitFunc2 called
atexitFunc called
Beachten Sie, dass zuerst atexitFunc2
und dann atexitFunc
aufgerufen wird. Alternativ kann dieses Programm auch direkt durch den Aufruf des Systemaufrufs _exit
beendet werden, der den Prozess sofort beendet. Beachten Sie aber, dass dabei die mit atexit
registrierte Funktion nicht aufgerufen wird. Im Gegensatz dazu schließt _exit
offene Dateideskriptoren, was eine unbekannte Verzögerung verursachen kann, bevor der Prozess beendet wird. Zusätzlich kann man die Anweisung return
mit dem gewünschten Statuswert verwenden, um ein ähnliches Beendigungsverhalten wie bei der Funktion exit
zu erreichen.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void atexitFunc(void) { printf("atexitFunc called\n"); }
static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }
int main(int argc, char *argv[]) {
if (atexit(atexitFunc) != 0) {
perror("atexit");
exit(EXIT_FAILURE);
}
if (atexit(atexitFunc2) != 0) {
perror("atexit");
exit(EXIT_FAILURE);
}
printf("Executing the program...\n");
sleep(5);
_exit(EXIT_SUCCESS);
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook