Usa la funzione exit in C
-
Utilizzare la funzione
exit
per terminare il processo in C -
Utilizzare la funzione
atexit
per registrare il gestore di uscita in C
Questo articolo mostrerà diversi metodi su come utilizzare la funzione exit
in C.
Utilizzare la funzione exit
per terminare il processo in C
Quando un determinato programma è in esecuzione su un sistema operativo basato su UNIX, viene chiamato processo. Il processo può essere un programma in stile demone di lunga esecuzione o una semplice utilità della riga di comando, ma alla fine entrambi arrivano al punto di terminazione prima o poi. La terminazione può essere anormale causata da qualche segnale di errore / consegnato, oppure il processo stesso può terminare normalmente come comportamento normale chiamando la funzione di libreria exit
. Accetta un singolo argomento intero che specifica il valore di terminazione che viene restituito al processo genitore. Notare che la funzione exit
non ritorna nel processo di chiamata.
La funzione exit
è la funzione di libreria standard che è costruita sopra la chiamata di sistema _exit
(di cui parleremo nei prossimi paragrafi). Tuttavia, esegue più operazioni oltre a portare il chiamante al punto di terminazione. Vale a dire, exit
esegue alcune routine di pulizia per il programma come la funzione registrata quando vengono invocati i gestori di uscita, i buffer dei flussi di I/O standard vengono scaricati e solo allora viene chiamato _exit
. Tieni presente che _exit
è una chiamata di sistema specifica per UNIX, mentre exit
fa parte della libreria C standard e può essere utilizzata su piattaforme diverse.
Il seguente esempio mostra la chiamata alla funzione exit
con il parametro di stato EXIT_SUCCESS
, una macro costante di valore 0
che convenzionalmente denota un ritorno riuscito.
#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);
}
Produzione:
Executing the program...
Utilizzare la funzione atexit
per registrare il gestore di uscita in C
La funzione atexit
è usata per registrare i gestori di uscita, che sono solo funzioni implementate dall’utente che dovrebbero essere chiamate quando il processo è terminato usando la chiamata exit
. atexit
accetta il puntatore a funzione di tipo void (*function)(void)
come unico argomento.
Notare che più funzioni possono essere registrate da più chiamate atexit
, il che porta all’esecuzione delle funzioni date in ordine inverso rispetto alla registrazione. atexit
restituisce un valore diverso da zero se la chiamata fallisce. Tieni presente che le funzioni registrate potrebbero non essere chiamate se il processo viene terminato in modo anomalo da un segnale esterno. Il codice di esempio successivo implementa due funzioni statiche
da registrare come gestori di uscita e, dopo 5 secondi di sospensione, il processo termina con una chiamata di 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);
}
Produzione:
Executing the program...
atexitFunc2 called
atexitFunc called
Nota che atexitFunc2
viene chiamato prima e poi atexitFunc
. In alternativa, questo programma può essere terminato direttamente chiamando la chiamata di sistema _exit
, che termina immediatamente il processo. Ricorda però che non chiamerà la funzione registrata con atexit
. Al contrario, _exit
chiude i descrittori di file aperti, il che può causare un ritardo sconosciuto prima che il processo venga terminato. Inoltre, si può usare l’istruzione return
con il valore di stato desiderato per provocare un comportamento di terminazione simile a quello fornito dalla funzione 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