GNU/Linux >> Linux Esercitazione >  >> Linux

exit() può non riuscire a terminare il processo?

Sì, ci sono alcune circostanze, come:

La funzione exit() deve prima chiamare tutte le funzioni registrate da atexit(), nell'ordine inverso rispetto alla loro registrazione, tranne per il fatto che una funzione viene chiamata dopo qualsiasi funzione precedentemente registrata che era già stata chiamata al momento della registrazione. Ogni funzione viene richiamata tante volte quante sono state registrate. Se, durante la chiamata a una di queste funzioni, viene effettuata una chiamata alla funzione longjmp() che terminerebbe la chiamata alla funzione registrata, il comportamento non è definito.

Se una funzione registrata da una chiamata a atexit() non viene restituita, le restanti funzioni registrate non devono essere chiamate e il resto dell'elaborazione di exit() non deve essere completato. Se exit() viene chiamato più di una volta, il comportamento è indefinito.

Vedi la pagina POSIX all'uscita.

Per ulteriori informazioni, allega un debugger quando raggiungi la situazione e dai un'occhiata allo stack di chiamate.


Stai chiamando exit() dal gestore del segnale?

In man 7 signal , sezione Funzioni Async-signal-safe puoi vedere tutte le funzioni che sono garantite per funzionare quando chiamate da un gestore di segnali:

Una funzione di gestione del segnale deve essere molto attenta, poiché l'elaborazione altrove può essere interrotta in un punto arbitrario dell'esecuzione del programma. POSIX ha il concetto di "funzione sicura". Se un segnale interrompe l'esecuzione di una funzione non sicura e il gestore chiama una funzione non sicura, allora il comportamento del programma non è definito.

POSIX.1-2004 (noto anche come POSIX.1-2001 Technical Corrigendum 2) richiede un'implementazione per garantire che le seguenti funzioni possano essere chiamate in modo sicuro all'interno di un gestore di segnale:

Qui puoi vedere le funzioni _Exit() , _exit() e abort() , ma in particolare non exit() . Quindi non dovresti chiamarlo da un gestore di segnale.

La cosa brutta è che anche se chiami una funzione non sicura da un gestore di segnale (printf() qualsiasi?) funzionerà solo per la maggior parte del tempo... ma non sempre.


Linux
  1. Come chiamare una funzione Bash nello script Bash all'interno di Awk?

  2. Come creare e chiamare funzioni in Bash

  3. Processi UNIX / Linux:funzione C fork()

  4. Come può un processo intercettare stdout e stderr di un altro processo su Linux?

  5. Posso utilizzare GDB per eseguire il debug di un processo in esecuzione?

Come uccidere un processo in Linux? Comandi per terminare

Chiamata alla funzione non definita simplexml_load_file() – Errore PHP [risolto]

Codice di uscita predefinito al termine del processo?

Processi Linux:layout di memoria, uscita e funzioni C _exit

Posso riprendere un processo vim esistente?

funzione di chiamata dichiarata di seguito