Utilisez la fonction exit en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction exit pour terminer le processus en C
  2. Utilisez la fonction atexit pour enregistrer le gestionnaire de sortie en C
Utilisez la fonction exit en C

Cet article présente plusieurs méthodes d’utilisation de la fonction exit en C.

Utiliser la fonction exit pour terminer le processus en C

Lorsque le programme donné fonctionne sur un système d’exploitation basé sur UNIX, il est appelé processus. Le processus peut être un programme de type démon qui fonctionne depuis longtemps ou un simple utilitaire en ligne de commande, mais tous deux finissent par atteindre leur point de terminaison à un moment donné. La terminaison peut être anormale en raison d’une erreur ou d’un signal délivré, ou le processus lui-même peut se terminer de manière élégante, comme le fait le comportement normal, en appelant la fonction de bibliothèque exit. Elle prend un seul argument entier qui spécifie la valeur de terminaison qui est renvoyée au processus parent. Notez que la fonction exit ne retourne pas dans le processus appelant.

La fonction exit est la fonction de bibliothèque standard qui est construite sur l’appel système _exit (que nous allons discuter dans les prochains paragraphes). Cependant, elle effectue plus d’opérations que de simplement conduire l’appelant au point de terminaison. A savoir, exit fait une routine de nettoyage pour le programme comme les fonctions enregistrées comme gestionnaires de sortie sont invoquées, les tampons standards des flux d’E/S sont vidés, et seulement alors _exit est appelé. Notez que _exit est un appel système spécifique à UNIX, alors que exit fait partie de la bibliothèque C standard et peut être utilisé sur différentes plateformes.

L’exemple suivant démontre l’appel de fonction exit avec le paramètre de statut EXIT_SUCCESS, une constante macro de valeur 0 indiquant conventionnellement un retour réussi.

#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);
}

Production :

Executing the program...

Utilisez la fonction atexit pour enregistrer le gestionnaire de sortie en C

La fonction atexit est utilisée pour enregistrer les gestionnaires de sortie, qui sont juste des fonctions implémentées par l’utilisateur qui doivent être appelées lorsque le processus est terminé en utilisant l’appel exit. La fonction atexit prend le pointeur de fonction de type void (*function)(void) comme seul argument.

Notez que plusieurs fonctions peuvent être enregistrées par plusieurs appels atexit, ce qui conduit à l’exécution des fonctions données dans l’ordre inverse de l’enregistrement. atexit renvoie une valeur non nulle si l’appel échoue. Notez que les fonctions enregistrées peuvent ne pas être appelées si le processus se termine anormalement par un signal externe. L’exemple de code suivant implémente deux fonctions static à enregistrer comme gestionnaires de sortie, et après 5 secondes de sommeil, le processus se termine par un appel exit.

#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);
}

Production :

Executing the program...
atexitFunc2 called
atexitFunc called

Notez que atexitFunc2 est appelé en premier et ensuite atexitFunc. Alternativement, ce programme peut être terminé directement en appelant l’appel système _exit, qui termine immédiatement le processus. Attention cependant, il n’appellera pas les fonctions enregistrées avec atexit. En revanche, _exit ferme les descripteurs de fichiers ouverts, ce qui peut causer un délai inconnu avant que le processus ne soit terminé. De plus, on peut utiliser l’instruction return avec la valeur de statut désirée pour provoquer un comportement de terminaison similaire à celui de la fonction exit.

#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);
Auteur: 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

Article connexe - C Process