Verwendung der exit-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion exit zum Beenden eines Prozesses in C
  2. Verwendung der Funktion atexit zur Registrierung eines Exit-Handlers in C
Verwendung der exit-Funktion 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);
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C Process