Use a função de saída em C

Jinku Hu 12 outubro 2023
  1. Use a função exit para encerrar o processo em C
  2. Use a função atexit para registrar o manipulador de saída em C
Use a função de saída em C

Este artigo irá demonstrar vários métodos de como usar a função exit em C.

Use a função exit para encerrar o processo em C

Quando o programa fornecido está sendo executado em um sistema operacional baseado em UNIX, é chamado de processo. O processo pode ser um programa estilo daemon de longa execução ou um utilitário de linha de comando simples, mas, eventualmente, ambos chegam ao ponto de término em algum momento. O encerramento pode ser anormal causado por alguma falha / sinal entregue, ou o próprio processo pode terminar normalmente como o comportamento normal chamando a função de biblioteca exit. Leva um único argumento inteiro que especifica o valor de terminação que é retornado ao processo pai. Observe que a função exit não retorna no processo de chamada.

A função exit é a função de biblioteca padrão construída sobre a chamada do sistema _exit (que discutiremos nos próximos parágrafos). Ainda assim, ele realiza mais operações do que apenas levar o chamador ao ponto de terminação. A saber, exit faz alguma rotina de limpeza para o programa como a função registrada quando os manipuladores de saída são chamados, buffers de fluxos de E/S padrão são esvaziados e somente então _exit é chamado. Lembre-se de que _exit é uma chamada de sistema específica do UNIX, enquanto exit faz parte da biblioteca C padrão e pode ser utilizada em diferentes plataformas.

O exemplo a seguir demonstra a chamada de função exit com o parâmetro de status EXIT_SUCCESS, uma constante de macro de valor 0 denotando convencionalmente um retorno bem-sucedido.

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

Resultado:

Executing the program...

Use a função atexit para registrar o manipulador de saída em C

A função atexit é usada para registrar manipuladores de saída, que são apenas funções implementadas pelo usuário que devem ser chamadas quando o processo é encerrado usando a chamada exit. atexit leva um ponteiro de função do tipo void (*function)(void) como o único argumento.

Observe que várias funções podem ser registradas por várias chamadas atexit, o que leva à execução das funções fornecidas na ordem inversa do registro. atexit retorna um valor diferente de zero se a chamada falhar. Lembre-se de que as funções registradas podem não ser chamadas se o processo for encerrado de forma anormal por um sinal externo. O próximo exemplo de código implementa duas funções estáticas a serem registradas como manipuladores de saída e, após 5 segundos de hibernação, o processo termina com uma chamada 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);
}

Resultado:

Executing the program...
atexitFunc2 called
atexitFunc called

Observe que atexitFunc2 é chamado primeiro e depois atexitFunc. Alternativamente, este programa pode ser encerrado diretamente chamando a chamada de sistema _exit, que encerra imediatamente o processo. Porém, lembre-se de que ele não chamará a função registrada com atexit. Em contraste, _exit fecha os descritores de arquivo abertos, o que pode causar um atraso desconhecido antes que o processo seja encerrado. Além disso, pode-se usar a instrução return com o valor de status desejado para causar comportamento de encerramento semelhante ao fornecido pela função 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

Artigo relacionado - C Process