C LANGUAGE TECHNOLOGY

【C言語】標準出力と標準エラー出力の違い

悩んでいる人

C言語で標準出力と標準エラー出力の違いを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C言語の標準出力と標準エラー出力の違い

C言語の標準出力と標準エラー出力の違いを説明します.

3つの標準ファイルストリーム

プログラムには下表の3つの標準ファイルストリームが自動で用意されます.

ファイルディスクリプタファイルストリームFILE型構造体のポインタ名
0標準入力stdin
1標準出力stdout
2標準エラー出力stderr

標準入力はファイルディスクリプタstdinからの入力,標準出力はファイルディスクリプタstdoutへの出力,標準エラー出力はファイルディスクリプタstderrへの出力です.

標準入力はscanf/fscanf関数で利用されますが,本記事では利用しないので詳細な説明は省略します.

標準出力と標準エラー出力は主に以下の用途で利用します.

  • 標準出力:プログラムのユーザへの提示(例:入力の指示)
  • 標準エラー出力:バグやエラー処理が発生した時の表示(例:バグの修正や分析)

これらをきちんと分離することで,効率的にデバッグができるようになります.

標準出力と標準エラー出力のコード

標準出力と標準エラー出力のコードは以下になります.

実行結果は以下になります.

リダイレクトして出力先を分けると以下になります.

標準出力がstdout.txt,標準エラー出力がstderr.txtに書き込まれていることがわかります.

標準出力はデータをバッファに保存してからブロック単位で出力(block buffered)するのに対して,標準エラー出力はデータをすぐに出力します(unbuffered).

例えば,fprintf.cの9~10行目のように標準出力,標準エラー出力の順番にコードを書いた場合,標準エラー出力が先に実行されることがあります.

ここで,バッファがある場合はプログラムが高速になりますが,バッファ内のデータの出力が遅延されます.

これに対して,バッファがない場合は,すぐにデータが出力されますが,プログラムが低速になります.

このようにバッファの有無でトレードオフがあるので,用途に応じて使い分けましょう.

以下のように>&記号で標準出力と標準エラー出力をfprintf.txtファイルに出力した場合,stderr,stdoutの順番で出力されています(3~4行目).

ファイルストリームのバッファの設定変更

ファイルストリームのバッファの設定を変更することで,stdout,stderrの順番に出力するように設定を変更できます.

setbuf関数ですぐに出力

setbuf関数でファイルストリームのバッファを設定します.

ファイルストリームstreamのバッファbufにNULLポインタを設定すると,すぐに出力します(unbuffered).

setbuf関数でstdoutをNULLに設定したコードは以下になります.

このコードでは,stdoutはstderrのようにすぐに出力する設定(unbuffered)になっています(9行目).

実行結果は以下になります.

stdout,stderrの順番に出力していることがわかります.

fflush関数で強制的に出力

fflush関数でファイルストリームのバッファを強制的に出力(フラッシュ)します.

fflush関数でstdoutの内容を強制的に出力するコードは以下になります.

fflush関数はstdoutとstderrの間で呼び出しています(10行目).

実行結果は以下になります.

flush関数を呼び出したことで,stdout,stderrの順番に出力されていることがわかります.

まとめ

C言語で標準出力と標準エラー出力の違いを説明しました.

標準出力と標準エラー出力を分離することで,効率的にデバッグができるようになります.

是非,使いこなしましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語エンジニアになりたいあなたにおすすめのオンラインプログラミングスクール3社で自分に合うスクールを見つけましょう.

-C LANGUAGE, TECHNOLOGY
-, , , , , , ,

© 2021 元東大教員/アメリカのスタートアップCTO