linuxの下のstdin,stdout,stderr

9883 ワード

参照自在linuxではstdin,stdout,stderrがよく見られるが,この3つは端末(Terminal)と呼ばれる標準入力(standard input),標準出力(standard out),標準エラー出力(standard error)である.
man stdinでマニュアルを見るとstdioにあることがわかります.hで定義されています.linuxがプログラムの実行を開始すると、プログラムはデフォルトでこの3つのファイルストリームを開き、端末に対して入出力操作を行うことができます.
次に、この3つのファイルストリームをc言語でシミュレートします.
ひょうじゅんにゅうりょく
c言語ではscanf関数を呼び出してユーザ入力コンテンツを受け入れる、すなわち端末装置からコンテンツを入力すると表現される.fscanfでstdin受信コンテンツを指定することもできます.標準入力のファイル識別子は0です.
#include 
 
intmain(void)
{
    charstr[10];
    scanf("%s", str);
    fscanf(stdin, "%s", str);
 
    return0;
}

標準出力(standard out)
c言語ではprintf関数を呼び出してコンテンツを端末に出力するように表現される.fprintfを使用してコンテンツを端末に出力することもできます.標準出力のファイル識別子は1です.
#include 
 
intmain(void)
{
    printf("%s
"
, "hello"); fprintf(stdout, "%s
"
, "hello"); return0; }

標準エラー出力(standard error)
標準エラーは標準出力と同様に端末に出力され、標準エラー出力のファイル識別子は2である.
プログラム処理の際、通常の情報出力を標準出力とし、エラーが発生した出力を標準エラー出力とする.これにより、リダイレクト時に正常な情報と誤った情報を異なるファイルにリダイレクトすることができます.
#include 
 
intmain(void)
{
    printf("%s
"
, "hello"); fprintf(stderr, "%s
"
, "error"); return0; }

上記のプログラムはそれぞれ端末とstderrに情報を出力し、このプログラムをコンパイルしてバイナリファイルa.outを生成し、以下のコマンドで実行し、出力にリダイレクトします.
# 1 stdout      , 2 stderr      
# "hello
" ( ) log.txt, "error
" error.txt
./a.out 1>log.txt 2>error.txt

これで出力内容helloをlogに保存する.txtファイル、エラーメッセージerrorがerrorに保存されました.txtファイル.(つまり配管による再配置)
c言語ではfreopen関数を使用して出力ストリームをリダイレクトすることもできます
#include 
 
intmain(void)
{
    FILE*out = freopen("out.txt", "w", stdout);
    printf("%s
"
, "hello"); return0; }

上記のコードコンパイル実行後、端末にはコンテンツが出力されずoutに保存する.txtこのファイルです.
stdoutとstderrの違い
1.linuxでは、標準出力と標準エラーのデフォルトは端末に情報を出力しますが、どのような違いがありますか?
次のプログラムの出力は何ですか.
#include 

int main()
{
    fprintf(stdout,"Hello ");
    fprintf(stderr,"World!");

    return 0;
}

答えは:World!Hello
なぜですか?**デフォルトではstdoutは行バッファで、その出力はまず1つのbufferの中に置いて、改行する時だけスクリーンに出力されます.stderrはバッファなしで、直接出力されます.**例えば、fprintf(stdout、「xxxx」)およびfprintf(stdout、「xxxx」)であり、前者は、新しい行または関数の戻りに遭遇するまでバッファをリフレッシュして出力するまで、戻り時にbufferをリフレッシュしない.fprintf(stderr,「xxxx」)は,有無にかかわらず直接出力する.
まず、プログラムが最初の印刷文を実行すると、stdoutは行バッファであり、ここに改行符がないため、関数が返され、印刷する内容はバッファに残っている.次に、stderrがバッファなしであるため、2番目の印刷文を実行します.World!端末に直接印刷する.最後に,関数は戻り文returnを実行し,バッファ内のHelloはこのとき洗い流され,端末で印刷される.
だから、プログラム全体の実行結果は:World!Hello
2.stdout、stderrがリダイレクトされると、何が起こりますか?
質問:次のプログラムgccをコンパイルした後、それぞれ次の2つのコマンドを実行します.結果は何ですか.
./a.out 1>stdout.file 
./a.out 2>stderr.file
#include 

int main()
{
    printf("a
"
); fprintf(stdout,"b
"
); fprintf(stderr, "c
"
); return 0; }

結果:
# a, b   stdout.file,     c
./a.out 1>stdout.file 
# c   stderr.file,     a, b
./a.out 2>stderr.file

まとめ
総じて、stdin、stdout、stderrは端末と密接な関係があり、通常、本番環境では、この3つのストリームが他のファイルにリダイレクトされます.