exit - causa un termine normale del processo
Standard C library (
libc,
-lc)
#include <stdlib.h>
[[noreturn]] void exit(int status);
La funzione
exit() provoca il termine normale dei processi e il byte meno
significativo di
status (i.e.,
status & 0xFF) è
restituito al genitore (vedere
wait(2)).
Tutte le funzioni registrate con
atexit(3) e
on_exit(3) sono
chiamate, in ordine inverso rispetto alla loro registrazione. (È
possibile per una di queste funzioni usare
atexit(3) o
on_exit(3) per registrare una funzione aggiuntiva da eseguire durante
il processo di uscita; la nuova registrazione è aggiunta all'inizio
dell'elenco di funzioni che rimane da chiamare). Se una di queste funzioni non
restituisce niente (per esempio, chiama
_exit(2), o si termina da sola
mandandosi un segnale), non viene chiamata nessuna delle funzioni rimanenti, e
la successiva uscita in elaborazione (in particolare, lo svuotamento degli
stream
stdio(3)) viene abbandonata. Se una funzione è stata
registrata più volte usando
atexit(3) o
on_exit(3),
verrà chiamata tante volte quante sono le registrazioni.
Tutti gli stream
stdio(3) aperti sono svuotati e chiusi. I file creati
con
tmpfile(3) sono rimossi.
Il C standard specifica due costanti,
EXIT_SUCCESS e
EXIT_FAILURE,
che possono essere passate a
exit() per indicare rispettivamente il
successo o l'insuccesso di una chiusura.
La funzione
exit() non restituisce nulla.
Per la spiegazione dei termini usati in questa sezione, vedere
attributes(7).
Interfaccia |
Attributo |
Valore |
exit() |
Thread safety |
MT-Unsafe race:exit |
La funzione
exit() usa una variabile globale che non è protetta,
quindi non è thread-safe.
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Il comportamento è indefinito se una delle funzioni registrate usando
atexit(3) e
on_exit(3) chiama
exit() o
longjmp(3).
Da notare che una chiamata a
execve(2) rimuove le registrazioni create
con
atexit(3) e
on_exit(3).
L'uso di
EXIT_SUCCESS e
EXIT_FAILURE è leggermente
più portabile (verso ambienti non-Unix) dell'uso di 0 e di qualche
valore diverso da zero come 1 o -1. In particolare, VMS usa una convenzione
differente.
BSD ha tentato di standardizzare i codici di uscita (che anche alcune librerie
C, come la libreria GNU C, hanno adottato); vedere il file
<sysexits.h>.
Dopo
exit(), lo stato di uscita deve essere trasmesso al processo
genitore. Ci sono tre casi:
- •
- Se il genitore ha impostato SA_NOCLDWAIT, o ha
impostato l'handler SIGCHLD a SIG_IGN, lo stato è
scartato e il processo figlio muore immediatamente.
- •
- Se il genitore stava aspettando il processo figlio, gli
viene notificato lo stato di uscita e il processo figlio muore
immediatamente.
- •
- Altrimenti, il processo figlio diviene un processo
"zombie": la maggior parte delle risorse di processo vengono
riciclate, ma uno slot contenente informazioni minimali sul processo
figlio (stato di interruzione, statistiche sull'uso di risorse) è
conservato nella tabella dei processi. Questo consente al genitore di
usare susseguentemente waitpid(2) (o simile) per avere informazioni
sullo stato di interruzione del processo figlio; a questo punto lo slot
del processo zombie viene rilasciato.
Se l'implementazione supporta il segnale
SIGCHLD, questo segnale è
inviato al genitore. Se il genitore ha impostato
SA_NOCLDWAIT, non
è definito se il segnale
SIGCHLD è inviato.
Se il processo in uscita è un leader di sessione e il suo terminale di
controllo è il terminale di controllo della sessione, allora a ciascun
processo nel gruppo dei processi in primo piano di questo terminale di
controllo viene mandato un segnale
SIGHUP, e il terminale è
disassociato da questa sessione, permettendone l'acquisizione da parte di un
nuovo processo controllante.
Se l'uscita del processo fa sì che un gruppo di processo divenga orfano,
e se un qualunque membro del nuovo gruppo del processo orfano viene fermato,
allora verrà mandato un segnale
SIGHUP seguito da un segnale
SIGCONT a ciascun processo in questo gruppo di processo. Si veda
setpgid(2) per una spiegazione dei gruppi di processi orfani.
Al di fuori dei casi di cui sopra, dove i processi segnalati possono essere
figli del processo che viene interrotto, l'interruzione di un processo
generalmente
non provoca l'invio di un segnale al figlio di quel
processo. Comunque, un processo può usare l'operazione
prctl(2)
PR_SET_PDEATHSIG per fare in modo che riceva un segnale se il suo
genitore termina.
_exit(2),
get_robust_list(2),
setpgid(2),
wait(2),
atexit(3),
on_exit(3),
tmpfile(3)
La traduzione italiana di questa pagina di manuale è stata creata da
Giulio Daprelà <
[email protected]>, Elisabetta Galli
<
[email protected]> e Marco Curreli <
[email protected]>
Questa traduzione è documentazione libera; leggere la
GNU
General Public License Versione 3 o successiva per le condizioni di
copyright. Non ci assumiamo alcuna responsabilità.
Per segnalare errori nella traduzione di questa pagina di manuale inviare un
messaggio a
[email protected]