Use a função de saída em C
-
Use a função
exit
para encerrar o processo em C -
Use a função
atexit
para registrar o manipulador 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);
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