Ya, ada beberapa keadaan, seperti:
Fungsi exit() pertama-tama akan memanggil semua fungsi yang didaftarkan oleh atexit(), dalam urutan terbalik dari pendaftarannya, kecuali bahwa suatu fungsi dipanggil setelah fungsi terdaftar sebelumnya yang telah dipanggil pada saat didaftarkan. Setiap fungsi dipanggil sebanyak yang didaftarkan. Jika, selama panggilan ke fungsi tersebut, panggilan ke fungsi longjmp() dibuat yang akan mengakhiri panggilan ke fungsi terdaftar, perilaku tidak ditentukan.
Jika sebuah fungsi yang didaftarkan oleh panggilan ke atexit() gagal dikembalikan, fungsi terdaftar yang tersisa tidak akan dipanggil dan pemrosesan exit() lainnya tidak akan selesai. Jika exit() dipanggil lebih dari sekali, perilaku tidak ditentukan.
Lihat halaman POSIX saat keluar.
Untuk informasi selengkapnya, lampirkan debugger saat Anda mencapai situasi tersebut dan lihat tumpukan panggilan.
Apakah Anda menelepon exit()
dari pengendali sinyal?
Di man 7 signal
, bagian Async-signal-safe functions Anda dapat melihat semua fungsi yang dijamin berfungsi saat dipanggil dari penangan sinyal:
Fungsi penangan sinyal harus sangat berhati-hati, karena pemrosesan di tempat lain dapat terganggu di beberapa titik tertentu dalam eksekusi program. POSIX memiliki konsep "fungsi aman". Jika sinyal menyela eksekusi fungsi yang tidak aman, dan penangan memanggil fungsi yang tidak aman, maka perilaku program tidak ditentukan.
POSIX.1-2004 (juga dikenal sebagai POSIX.1-2001 Technical Corrigendum 2) memerlukan implementasi untuk menjamin bahwa fungsi berikut dapat dipanggil dengan aman di dalam penangan sinyal:
Di sana Anda dapat melihat fungsi _Exit()
, _exit()
dan abort()
, tetapi terutama bukan exit()
. Jadi, Anda sebaiknya tidak memanggilnya dari penangan sinyal.
Hal buruknya adalah meskipun Anda memanggil fungsi yang tidak aman dari penangan sinyal (printf()
ada?) itu hanya akan bekerja sebagian besar waktu... tetapi tidak selalu.