(gdb) info symbol exit
exit in section .text of /lib64/libc.so.6
(gdb) info symbol _exit
_exit in section .text of /lib64/libc.so.6
誰もが知っていますか?
簡単に言えばexit
、プロセスを終了するために呼び出す必要がある高レベルの関数であり、終了時のハンドラーやその他の高レベルのクリーンアップ機能を呼び出します。_exit
は低レベルのクリーンアップ関数で、 の最後のステップとして呼び出されexit
ます。exit
実際にプロセスを終了します ( exit syscall を作成することにより)。
http://www.gnu.org/software/libc/manual/html_mono/libc.htmlの glibc マニュアルから(詳細については、glibc のソース コードも確認してください):
25.6.1 正常終了
プロセスは、そのプログラムが exit を呼び出して完了したことを通知すると、正常に終了します。main から戻ることは exit を呼び出すことと同じであり、main が返す値は exit の引数として使用されます。
— 関数: 無効な終了 (int ステータス)
exit 関数は、プログラムが終了したことをシステムに通知し、プロセスを終了させます。
status はプログラムの終了ステータスであり、プロセスの終了ステータスの一部になります。この関数は戻りません。
正常終了すると、次のアクションが発生します。
atexit または on_exit 関数で登録された関数は、登録の逆の順序で呼び出されます。このメカニズムにより、アプリケーションは、プログラムの終了時に実行される独自の「クリーンアップ」アクションを指定できます。通常、これは、プログラムの状態情報をファイルに保存したり、共有データベースのロックを解除したりするために使用されます。
開いているすべてのストリームが閉じられ、バッファリングされた出力データが書き出されます。ストリームを閉じるを参照してください。さらに、tmpfile 関数で開かれた一時ファイルは削除されます。一時ファイルを参照してください。
_exit が呼び出され、プログラムが終了します。終了の内部を参照してください。
そしてセクション「終了内部」で:
25.6.5 終了の内部
_exit 関数は、終了によるプロセスの終了に使用されるプリミティブです。これは、ヘッダー ファイル unistd.h で宣言されています。
— 関数: void _exit (int ステータス)
_exit 関数は、ステータス status でプロセスを終了させるためのプリミティブです。この関数を呼び出しても、atexit または on_exit で登録されたクリーンアップ関数は実行されません。