標準出力と標準エラー出力の違い
->
UNIXにおける入出力
標準出力と標準エラー出力の違いを考える前に、C言語でプログラムを書いたことがある人なら一度は聞いたことがあるであろう、標準入力、標準出力、標準エラー出力について簡単にまとめてみる。標準入力
プログラムへデータを入力するための入り口であり。一般的に、stdin と呼ばれる。通常、キーボードから入力されたデータは標準入力である。標準出力
プログラムの計算結果などのデータを出力する出力先。こちらは一般的に、stdout とも呼ばれる。特に指定がない場合、標準出力はディスプレイに表示される。⇒ リダイレクト
標準エラー出力
プログラムにエラーが起きた場合の診断用のメッセージなどを出力するための出力先。標準エラー出力は、stderr とも呼ばれる。特に指定がない場合、標準エラー出力はディスプレイに表示される。標準出力と標準エラー出力の違い
上の説明を見ると疑問に思うことが、標準出力と標準エラー出力の違いである。どちらも指定がない場合はディスプレイに出力することになっていて、以下のようなプログラムを実行すると両方の文字列が出力される。test1.c
1 2 3 4 5 | #include<stdio.h> main(){ fprintf(stdout, "stdout\n"); fprintf(stderr, "stderr\n"); } |
出力結果
% gcc test1.c % a.out stdout stderr
しかし、これをリダイレクトさせてみると結果が変化することが分かる。
出力結果
% gcc test1.c % a.out > result.txt stderr
今度は、stderrだけが出力され、stdoutはリダイレクト先であるresult.txtに保存されている。つまり、標準エラー出力は、プログラムの状態やエラーなどを、出力とは別にユーザに知らせるために用意されたものであると言える。例のような短いプログラムではこの有難みは分かりにくいが、何百行、何千行と処理を行い、その結果を出力するプログラムでは出力も何百行に及んだりすることもあり、どこでエラーが起きたか分かりにくくなってしまうことがある。例として、次のようなプログラムを考えてみる。
test2.c
1 2 3 4 5 6 7 8 9 10 11 | #include<stdio.h> main(){ int i; for(i=0; i<50; i++){ if(i==39) fprintf(stderr, "error : %d\n", i); else fprintf(stdout, "%d\n", i); } } |
これは、0~49までの数字を出力するプログラムであるが、39を出力するときだけエラーが起きたと仮定し、標準エラー出力にエラーを表示させるようにしている。これを先ほどと同じようにリダイレクトすると、
出力結果
% gcc test2.c % a.out > result2.txt error : 39
となり、エラー箇所の出力のみが表示されるようになり、人が見てもどこでエラーが起きているのか非常に分かりやすくなる。
プログラムを書く際には、標準出力と標準エラー出力をうまく使い分けて人に分かりやすいプログラムを書くことを心がけたい。
関連エントリー
カテゴリー: Linux
