C言語

【C言語】exit関数の正しい使い方

2021年9月27日

関数仕様

書式

引数

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 関数の使い方」にまとめています。

 

サンプルプログラム

ポイント

main 関数が int を返す関数として宣言されている場合、形式的に「return 0」も記述します。

実際に GCC でコンパイルした場合、_exit 関数はリターンしない関数として最適化が行われるため、
無駄なコードは出力されません。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, ,