関数仕様
書式
|
1 2 3 4 |
#include <unistd.h> void _exit(int status); |
引数
| status | 呼出し元プロセスの終了ステータス(親プロセスに渡す) |
戻り値
| なし | _exit関数はリターンしない |
機能
- 呼出し元のプロセスを終了させる
- 引数 status は終了ステータスとして親プロセスへ渡される
親プロセスは wait などのシステムコールで、この終了ステータスを受け取る
システムコール「_exit」とCライブラリ「exit」の違い
- システムコールの _exit 関数は、頭に「_ (アンダースコア)」が付いています
- システムコールの _exit 関数は、呼び出し元に戻らずにプロセスが終了する
- 標準Cライブラリの exit 関数は、atexit() 関数によって登録された関数を呼び出す
- 標準Cライブラリの exit 関数は、標準入出力ライブラリ(stdio)のバッファをフラッシュしてから、
システムコールの _exit 関数を呼び出す - main 関数を return で終了した場合は、標準Cライブラリの exit 関数が呼び出される
注意すること
注意ポイント
子プロセスを終了させる場合は、_exit() システムコールを使うこと。
子プロセスを終了する際に、main() 関数を return したり標準Cライブラリの exit() を呼出すのではなく、
システムコールの _exit() を呼出す必要があります。
先ほども説明しましたが、標準Cライブラリの exit() を呼出した場合は、
親プロセスから引き継いだ標準入出力ライブラリ(stdio)のバッファをクリアする処理が動くからです。
関連
子プロセスの生成方法については、「【C言語】fork 関数の使い方」にまとめています。
サンプルプログラム
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <unistd.h> void exit_process(void) { /* このプロセスの終了処理 */ _exit(0); } int main(void) { exit_process(); return 0; /* ここには到達しない */ } |
ポイント
main 関数が int を返す関数として宣言されている場合、形式的に「return 0」も記述します。
実際に GCC でコンパイルした場合、_exit 関数はリターンしない関数として最適化が行われるため、
無駄なコードは出力されません。