Există o diferență între funcțiile on_exit () și atexit ()?

Există vreo diferență între

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

și

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

altul decât faptul că funcția utilizată de on_exit obține statutul de ieșire?

Adică, dacă nu mă interesează starea de ieșire, există vreun motiv să folosiți unul sau altul?

Edit: Many of the answers warned against on_exit because it's non-stșiard. If I'm developing an app that is for internal corporate use și guaranteed to run on specific configurations, should I worry about this?

0
fr hi bn

5 răspunsuri

În conformitate cu acest link am constatat că se pare că există câteva diferențe. on_exit vă va permite să treceți într-un argument care este transmis funcției on_exit atunci când se numește ... care vă va permite să configurați unele indicii pentru a face unele lucrări de curățare când este momentul să ieșiți.

Mai mult, se pare că on_exit a fost o funcție specifică SunOS, care poate să nu fie compatibilă pe toate platformele ... așa că poate doriți să rămâneți atexit, în ciuda faptului că este mai restrictivă.

0
adăugat

@Nathan

Mai întâi, vedeți dacă există un alt apel API pentru a determina starea de ieșire ... o privire rapidă și nu văd una, dar nu sunt bine familiarizat cu standardul C API.

O alternativă ușoară este să aveți o variabilă globală care stochează starea de ieșire ... implicit fiind o cauză de eroare necunoscută (pentru cazul în care programul se termină anormal). Apoi, când apelați ieșirea, puteți stoca starea de ieșire în global și puteți prelua din orice funcții atexit. Acest lucru presupune stoca cu strictețe starea de ieșire înainte de fiecare apel de ieșire și în mod clar nu este ideal, dar dacă nu există nici un API și nu doriți să riscați ca on_exit să nu se afle pe platformă ... fi singura opțiune.

0
adăugat

Ar trebui să utilizați atexit() , dacă este posibil. on_exit() este nestandard și mai puțin frecvent. De exemplu, nu este disponibil pe OS X.

Kernel.org - on_exit() < :

Această funcție vine de la SunOS 4, dar este prezentă și în libc4, libc5 și   glibc. Nu mai există în Solaris (SunOS 5). Evitați această funcție și   utilizați în schimb atexitul standard (3).

0
adăugat

@Nathan, nu găsesc nici o funcție care să returneze codul de ieșire pentru procesul curent de rulare. Mă aștept că nu este setat încă în momentul în care atexit() este numit, oricum. Prin asta vreau sa spun ca runtime-ul stie ce este, dar probabil nu a raportat-o ​​la OS. Acest lucru este destul de mult doar presupunere, totuși.

Se pare că fie va trebui să utilizați on_exit() , fie să vă structurați programul astfel încât codul de ieșire să nu conteze. Nu ar fi nerezonabil ca ultima instrucțiune din funcția principală să întoarce o variabilă globală exited_cleanly la true. În funcția pe care o înregistrați cu atexit() , puteți verifica această variabilă pentru a determina cum a ieșit programul. Acest lucru vă va oferi doar două stări, dar mă aștept că ar fi suficient pentru majoritatea nevoilor. De asemenea, puteți extinde acest tip de schemă pentru a suporta mai multe state de ieșire, dacă este necesar.

0
adăugat

Diferența este că atexit este C și on_exit este o extensie ciudată disponibilă pentru GNU și ce-know-ce-alt sistem Unixy parte a POSIX).

0
adăugat