Domanda

C'è qualche differenza tra

   int on_exit(void (*function)(int , void *), void *arg);

E

   int atexit(void (*function)(void));

oltre al fatto che la funzione utilizzata da on_exit ottiene lo stato di uscita?

Cioè, se non mi interessa lo stato di uscita, c'è qualche motivo per utilizzare l'uno o l'altro?

Modificare: Molte delle risposte mettevano in guardia contro on_exit perché non è standard.Se sto sviluppando un'app per uso aziendale interno e garantita per l'esecuzione su configurazioni specifiche, dovrei preoccuparmi di questo?

È stato utile?

Soluzione

Secondo questo link Ho scoperto che sembra che ci siano alcune differenze. on_exit ti consentirà di passare un argomento che viene passato a on_exit funzione quando viene chiamato...che potrebbe consentirti di impostare alcuni puntatori su cui eseguire un lavoro di pulizia quando è il momento di uscire.

Inoltre, sembra che on_exit era una funzione specifica di SunOS che potrebbe non essere compatibile su tutte le piattaforme...quindi potresti voler restare con atexit, nonostante sia più restrittivo.

Altri suggerimenti

Dovresti usare atexit() se possibile. on_exit() non è standard e meno comune.Ad esempio, non è disponibile su OS X.

Kernel.org - on_exit():

Questa funzione proviene da Sunos 4, ma è presente anche in libc4, libc5 e glabc.Non si verifica più in Solaris (SunOS 5).Evita questa funzione e usa invece l'Atexit standard (3).

La differenza è questa atexit è C e on_exit è una strana estensione disponibile su GNU e chissà quali altri sistemi Unixy (ma NON parte di POSIX).

@Nathan, non riesco a trovare alcuna funzione che restituisca il codice di uscita per il processo attualmente in esecuzione.Mi aspetto che non sia ancora impostato il momento in cui atexit() si chiama, comunque.Con questo intendo che il runtime sa di cosa si tratta, ma probabilmente non lo ha segnalato al sistema operativo.Questa è praticamente solo una congettura, però.

Sembra che dovrai usarlo on_exit() oppure struttura il tuo programma in modo che il codice di uscita non abbia importanza.Non sarebbe irragionevole che l'ultima istruzione nella funzione principale inverta un globale exited_cleanly variabile a vero.Nella funzione con cui ti registri atexit(), puoi controllare questa variabile per determinare come è terminato il programma.Questo ti darà solo due stati, ma mi aspetto che sia sufficiente per la maggior parte delle esigenze.Se necessario, potresti anche espandere questo tipo di schema per supportare più stati di uscita.

@Nathan

Innanzitutto, controlla se c'è un'altra chiamata API per determinare lo stato di uscita...una rapida occhiata e non ne vedo uno, ma non sono esperto dell'API C standard.

Un'alternativa semplice è avere una variabile globale che memorizzi lo stato di uscita...l'impostazione predefinita è una causa di errore sconosciuta (ad esempio se il programma termina in modo anomalo).Quindi, quando chiami exit, puoi memorizzare lo stato di uscita nel globale e recuperarlo da qualsiasi funzione atexit.Ciò richiede la memorizzazione diligente dello stato di uscita prima di ogni chiamata di uscita e chiaramente non è l'ideale, ma se non è presente un'API e non vuoi rischiare on_exit non essere sulla piattaforma...potrebbe essere l'unica opzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top