はい、次のような状況があります:
<ブロック引用>exit() 関数は、最初に atexit() によって登録されたすべての関数を、登録の逆の順序で呼び出します。各関数は、登録された回数だけ呼び出されます。そのような関数の呼び出し中に、登録された関数の呼び出しを終了する longjmp() 関数の呼び出しが行われた場合、動作は未定義です。
atexit() の呼び出しによって登録された関数が返されない場合、残りの登録済み関数は呼び出されず、残りの exit() 処理は完了しません。 exit() が複数回呼び出された場合、動作は未定義です。
終了時に POSIX ページを参照してください。
詳細については、状況に到達したときにデバッガーをアタッチし、コール スタックを確認してください。
exit()
に電話していますか シグナルハンドラから?
man 7 signal
で 、セクション Async-signal-safe 関数 シグナル ハンドラーから呼び出されたときに動作することが保証されているすべての関数を確認できます。
プログラムの実行中の任意の時点で他の場所の処理が中断される可能性があるため、シグナルハンドラ関数は非常に注意する必要があります。 POSIX には「安全な機能」という概念があります。シグナルが安全でない関数の実行を中断し、ハンドラが安全でない関数を呼び出す場合、プログラムの動作は未定義です。
POSIX.1-2004 (POSIX.1-2001 Technical Corrigendum 2 とも呼ばれます) では、次の関数をシグナル ハンドラ内で安全に呼び出すことができることを保証する実装が必要です:
関数 _Exit()
が表示されます 、 _exit()
と abort()
、しかし特に exit()
ではありません .したがって、シグナル ハンドラから呼び出すべきではありません。
厄介なのは、シグナルハンドラから安全でない関数を呼び出しても (printf()
) ほとんどの場合は機能しますが、常に機能するとは限りません。