Ano, existují určité okolnosti, například:
Funkce exit() nejprve zavolá všechny funkce registrované atexit() v opačném pořadí jejich registrace, kromě toho, že funkce je volána po dříve zaregistrovaných funkcích, které již byly volány v době, kdy byla zaregistrována. Každá funkce je volána tolikrát, kolikrát byla zaregistrována. Pokud je během volání jakékoli takové funkce provedeno volání funkce longjmp(), které by ukončilo volání registrované funkce, chování není definováno.
Pokud se funkce registrovaná voláním atexit() nevrátí, zbývající registrované funkce nebudou volány a zbytek zpracování exit() nebude dokončen. Pokud je exit() voláno více než jednou, chování není definováno.
Podívejte se na stránku POSIX při ukončení.
Pro více informací připojte ladicí program, až se dostanete k situaci, a podívejte se na zásobník volání.
Voláte exit()
z obslužného programu signálu?
V man 7 signal
, sekce Asynchronní funkce bezpečné pro signál můžete vidět všechny funkce, které zaručeně fungují, když jsou volány z obsluhy signálu:
Funkce zpracování signálu musí být velmi opatrná, protože zpracování jinde může být přerušeno v libovolném bodě provádění programu. POSIX má koncept „bezpečné funkce“. Pokud signál přeruší provádění nebezpečné funkce a handler zavolá nebezpečnou funkci, pak chování programu není definováno.
POSIX.1-2004 (také známý jako POSIX.1-2001 Technical Corrigendum 2) vyžaduje implementaci, která zaručí, že v obslužném programu signálu lze bezpečně volat následující funkce:
Zde můžete vidět funkce _Exit()
, _exit()
a abort()
, ale zejména ne exit()
. Neměli byste to tedy volat od obsluhy signálů.
Ošklivé je, že i když zavoláte nebezpečnou funkci z obsluhy signálu (printf()
nějaké?) to bude fungovat většinu času... ale ne vždy.