Utilice la función exit en C

Jinku Hu 12 octubre 2023
  1. Utilice la función exit para finalizar el proceso en C
  2. Utilice la función atexit para registrar el controlador de salida en C
Utilice la función exit en C

Este artículo demostrará varios métodos de cómo utilizar la función exit en C.

Utilice la función exit para finalizar el proceso en C

Cuando el programa dado se ejecuta en un sistema operativo basado en UNIX, se denomina proceso. El proceso puede ser un programa de estilo demonio de larga ejecución o una simple utilidad de línea de comandos, pero eventualmente, ambos llegan al punto de terminación en algún momento. La terminación puede ser anormal causada por alguna señal de falla / entregada, o el proceso en sí mismo puede terminar con gracia como el comportamiento normal al llamar a la función de biblioteca exit. Toma un único argumento entero que especifica el valor de terminación que se devuelve al proceso principal. Tenga en cuenta que la función exit no regresa en el proceso de llamada.

La función exit es la función de biblioteca estándar que se construye sobre la llamada al sistema _exit (que vamos a discutir en los siguientes párrafos). Aún así, realiza más operaciones que solo llevar a la persona que llama al punto de terminación. Es decir, exit realiza alguna rutina de limpieza para el programa, como la función registrada cuando se invoca a los manejadores de salida, los búferes de flujos de E/S estándar se vacían y solo entonces se llama a _exit. Tenga en cuenta que _exit es una llamada al sistema específica de UNIX, mientras que exit es parte de la biblioteca C estándar y se puede utilizar en diferentes plataformas.

El siguiente ejemplo demuestra la llamada a la función exit con el parámetro de estado EXIT_SUCCESS, una macro constante de valor 0 que denota convencionalmente un retorno exitoso.

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

Producción :

Executing the program...

Utilice la función atexit para registrar el controlador de salida en C

La función atexit se utiliza para registrar controladores de salida, que son solo funciones implementadas por el usuario que deben llamarse cuando el proceso finaliza mediante la llamada exit. atexit toma un puntero de función de tipo void (*función)(void) como único argumento.

Tenga en cuenta que se pueden registrar múltiples funciones mediante múltiples llamadas atexit, lo que conduce a la ejecución de las funciones dadas en orden inverso al registro. atexit devuelve un valor distinto de cero si la llamada falla. Tenga en cuenta que es posible que las funciones registradas no se llamen si el proceso se termina de forma anormal mediante una señal externa. El siguiente código de ejemplo implementa dos funciones estáticas para ser registradas como manejadores de salida, y después de 5 segundos de suspensión, el proceso termina con una llamada da 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);
}

Producción :

Executing the program...
atexitFunc2 called
atexitFunc called

Tenga en cuenta que primero se llama a atexitFunc2 y luego a atexitFunc. Alternativamente, este programa puede terminarse directamente llamando a la llamada del sistema _exit, que termina inmediatamente el proceso. Sin embargo, tenga en cuenta que no llamará a la función registrada con atexit. Por el contrario, _exit cierra los descriptores de archivos abiertos, lo que puede provocar un retraso desconocido antes de que finalice el proceso. Además, se puede utilizar la declaración return con el valor de estado deseado para provocar un comportamiento de terminación similar al que proporciona la función 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);
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

Artículo relacionado - C Process