Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 一般ユーティリティライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(29/36) - ユーティリティライブラリ(2/5)

14.41 プロセスの終了関数

14.41.1 abort関数

abort関数はプロセスを異常終了します。ファイルのオープンが出来なかったような場合で、プロセスの実行を緊急に終了させたいような場合に使うと良いでしょう。

【表14-7-2】 abort関数
形式#include <stdlib.h>
void abort(void);
返り値ありません。
引数 ありません。

14.41.2 exit関数

exit関数はプロセスを正常終了します。main関数の場合はreturn文で帰るのと同じです。

exit関数の引数用にEXIT_SUCCESS(正常終了)とEXIT_FAILURE(異常終了)の2つの定数が用意されています。移植性を考慮しなければならないような場合は使用すると良いでしょう。(return文の引数として使うことも出来ます)

【表14-7-3】 exit関数
形式#include <stdlib.h>
void exit(int status);
返り値ありません。
引数
int status
親プロセスへ返す値を指定します。指定できる値は0〜255までの値です。

14.41.3 atexit関数

atexit関数はプロセスが正常終了した場合に実行する関数を登録します。登録した関数はmain関数からreturn文で帰る場合や、exit関数が実行された場合に呼び出され実行します。

atexit関数を複数回実行して複数の関数を登録することも出来ますし、同じ関数を複数回登録することもできます。なお、複数登録した場合は登録した順番とは逆の順番で呼び出されます。

【表14-7-4】 atexit関数
形式#include <stdlib.h>
int atexit(void (*function)(void));
返り値関数登録が成功した場合は0を返します。エラーの場合は0以外を返します。
引数
void (*function)(void)
登録する関数を指定します。登録した関数に引数は指定できません。

14.41.4 例題

実行時引数で指定したファイルの内容を標準出力に出力します。ファイルのオープンやクローズが出来なかった場合はabort関数で異常終了します。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.     FILE    *fp;
  7.     int     one_char;
  8.  
  9.     if(argc == 2)
  10.     {
  11.         if((fp = fopen(*(argv + 1), "r")) != NULL)
  12.         {
  13.             /* オープン成功。ファイルから1文字ずつ入力 */
  14.             while((one_char = fgetc(fp)) != EOF)
  15.             {
  16.                 printf("%c", (char)one_char);
  17.             }
  18.  
  19.             if(fclose(fp) != 0)
  20.             {
  21.                 /* クローズ失敗 */
  22.                 abort();
  23.             }
  24.         }
  25.         else
  26.         {
  27.             /* オープン失敗 */
  28.             abort();
  29.         }
  30.     }
  31.     else
  32.     {
  33.         printf("実行時引数が不当です。\n");
  34.         exit(EXIT_FAILURE);
  35.     }
  36.  
  37.     return EXIT_SUCCESS;
  38. }
$ ./ex14_7_1.prg /etc/issue
Fedora release 10 (Cambridge)
Kernel \r on an \m (\l)

$ echo $? ← 直前に実行したプログラムの返り値を表示します
0
$
$ ./ex14_7_1.prg /etc/issue_1
アボートしました ← abort関数で出力したメッセージですが処理系により変わります
$ echo $?
134
$
$ ./ex14_7_1.prg /etc/issue /etc/issue_1
実行時引数が不当です。
$ echo $?
1
$
2行目
プロセスの終了関数を使いますのでstdlib.hを取り込みます。
22行目
ファイルのクローズが出来なかったためabort関数で異常終了します。
28行目
ファイルのオープンが出来なかったためabort関数で異常終了します。
34行目
実行時引数が不当なため引数にEXIT_FAILUREを指定したexitt関数で終了します。(return EXIT_FAILURE;でも同じです)
37行目
返り値にEXIT_SUCCESSを指定して、return文で終了します。(exit(EXIT_SUCCESS);でも同じです)