OS:Mac OS X
最近、コマンドの出力を標準出力か標準エラー出力かで分ける処理をやったりしたので、忘れないうちに復習の意味を込めて。
1. C言語の標準出力
標準出力とは、おなじみのprintf関数などで文字列を出力する場合に使用するストリームです。標準出力の実態は、FILE*型の変数です。このポインタにstdoutという名前を付けたものが標準出力です。
次の2行はどちらも標準出力に"Hello world"と出力します。
printf("Hello world\n");
fprintf(stdout, "Hello world\n");
fprintf(stdout, "Hello world\n");
2. C言語の標準エラー出力
C言語には、もうひとつの出力ストリームがあります。標準エラー出力です。これは、主にプログラム内でエラーが発生した場合に、その旨を出力する用途で使用されます。これも、実態はFILE*型の変数で、stderrという名前が付いています。
次のプログラムは標準エラー出力に"Hello world"と出力します。
fprintf(stderr, "Hello world\n");
通常、標準エラーもコンソールに表示されてしまうので、区別が付きにくいのですが、次のように2>の後に出力先ファイルを指定すると、標準エラー出力だけがファイルに書き込まれます。
>プログラム 2> ファイル名
>は実行したプログラムの出力でファイル内容を上書きするリダイレクトという機能で、2は標準エラー出力を表します。ちなみに、1>とすると、標準出力を指定したファイルに書き出すことができます。
3. 使用例
標準出力と標準エラー出力を使ったプログラムを作成して、それぞれがちゃんと出力されるか確認します。
ソースは以下のようになります(ファイル名はstdio.cとします)。
#include <stdio.h>
int main()
{
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
return 0;
}
int main()
{
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
return 0;
}
これを、
> cc stdio.c
でコンパイルすると、a.outという実行ファイルが生成されるので、
> ./a.out 1> stdout.txt 2> stderr.txt
で実行すると、stdout.txtには"stdout"と書き込まれ、stderr.txtには"stderr"と書き込まれます。