バッファリング 解答ページ | Programming Place Plus C言語編 第43章

トップページC言語編第43章

問題①

問題① 標準出力へ書き出す内容がバッファに残されている状態で、 main関数の終了、exit関数による終了、abort関数による終了がそれぞれどのような結果になるか確認してください。


たとえば、次のようなプログラムを書いて確かめられます。

#include <stdio.h>
#include <stdlib.h>

#define EXIT_TYPE 0  // プログラムの終わり方
                     //  0: return
                     //  1: exit関数
                     //  2: abort関数

int main(void)
{
    static char stdout_buf[BUFSIZ];

    if (setvbuf(stdout, stdout_buf, _IOFBF, sizeof(stdout_buf)) != 0) {
        fputs("stdout のバッファリングを変更できませんでした。\n", stderr);
        exit(EXIT_FAILURE);
    }

    printf("test");

#if EXIT_TYPE == 0
    return 0;
#elif EXIT_TYPE == 1
    exit(EXIT_SUCCESS);
#elif EXIT_TYPE == 2
    abort();
#endif
}

実行結果(return文の場合)

test

実行結果(exit関数の場合)

test

実行結果(abort関数の場合)

main関数から return で終了する場合と、exit関数で終了する場合には、バッファの内容はフラッシュされますから、きちんと出力されます。

abort関数で終了する場合は、バッファの内容がフラッシュされる保証はありません。もしかすると、きちんと出力されることもあるかもしれませんが、試した環境では出力されませんでした。もし、abort関数を使うのなら、このことを考慮して、重要な情報を fflush関数で確実に内容を出力させるようにします。

assertマクロも abort関数を呼び出してプログラムを終了させますが、assert はメッセージを表示させることを保証しているので、特に心配する必要はありません。

assertマクロは、標準エラーにメッセージを出力します。標準エラーは多くの場合、バッファリング無しになっているので、普通はバッファに取り残される問題は起こらないはずです。



参考リンク


更新履歴

’2018/3/18 全面的に文章を見直し、修正を行った。

’2010/6/11 新規作成。



第43章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る