Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all 

名前
stdin, stdout, stderr - 標準入出力ストリーム
書式
#include <stdio.h> extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;
説明
標準の環境では、 UNIX プログラムは起動時に、オープンされているストリー ムを 3 つ与えられる。それぞれ入力 用、出力用、診断メッセージやエラーメッ セージの表示用のものである。これらは通常ユーザーの端末 (tty(4) を 参照) に接続されているが、親プロセスでの選択・設定によってファイル や他のデバイスに関連づけられていること もある (sh(1) の「リダイレクション」セクションも参照のこと)。 入力ストリームは "standard input" と呼ばれる。出力ストリームは "standard output"、エラーストリームは "standard error" と呼ばれる。 これらの用語を短縮したものがそれぞれのファイルを示すシンボルとなる。つ まり stdin, stdout, stderr である。 これらのシンボルは stdio(3) のマクロで、 FILE へのポインター型である。したがって fprintf(3) や fread(3) などの関数とともに用いることができる。 FILE は UNIX のファイルディスクリプターにバッファー機能を追加したラッパー であるから、これらのマクロにも 対応するファイルがあり、 UNIX の raw ファ イルインターフェース (read(2) や lseek(2) など) によってアク セスすることもできる。 プログラムの起動時には、 ストリーム stdin, stdout, stderr に結びつけられているファイルディスクリプターの 番号は、 それぞれ 0, 1, 2 である。 プリプロセッサシンボル STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO は <unistd.h> 中でそれぞれこれらの値に定義されている。 (これらのストリームに対して freopen(3) を適用すること で、そのストリームに関連付けられたファイルディスクリプター の番号を変更することができる。) FILE と raw なファイルディスクリプターの併用は、予期できない結果を生じ ることがあるので、通常は避けるべき である。 (マゾヒスティックな人に: POSIX.1 のセクション 8.2.3 には、この混用で動作がどのようになりそう か が詳しく記述されている。) 一般的なルールは以下の通り: ファイルディスクリプターはカーネルによって 扱われ、 stdio は単にライブラリによって扱われるのである。すなわち例えば exec(3) の後には、子プロセスはオープンさ れているファイルディスクリプター をすべて継承するが、親からのストリームはすべてアクセス不可となる。 シンボル stdin, stdout, stderr はすべてマクロとして定義されているので、これらへの代入 は移植性を保証され ない。標準ストリームはライブラリ関数 freopen(3) を用いれば、別のファイルを示すように変更することもでき る。 このライブラリ関数は stdin, stdout, stderr の再割り当てが可能なように特別に導入されたものである。 標 準ストリームは exit(3) の呼び出しと、プログラムの正常終了によってクローズされる。
準拠
stdin, stdout, stderr マクロは C89 に準拠している。 また C89 では、これら 3 つのストリームがプログラム の 起動時にオープンされているべきであることが規定されている。
注意
stderr ストリームはバッファーリングされていない。 stdout ストリームは、端末に接続されているときには行単位 でバッファーリング されている。一行に満たない内容は、 fflush(3) か exit(3) が呼び出されるか、改行文字が 印字されるまで表示されない。これは、 特にデバッグ時において、予期しない結果を生じる原因となるかもしれな い。 標準ストリームの (あるいは他のすべてのストリームの) バッファーリングモードは、 setbuf(3) または setvbuf(3) を呼び出すことによって変更できる。 ただし、 stdin が端末に接続されているときは、端末のドライバ でバッファーリングされている 可能性がある点にも注意すること。これは stdio のバッファーリングとは全く 関係 なく存在しうる。 (実際、通常だと端末入力はカーネルによって行単位 でバッファーリングされている。) このカー ネルによる入力の扱いは tcsetattr(3) などの呼び出しによって変更することができる。 stty(1) と termios(3) も参照すること。
関連項目
csh(1), sh(1), open(2), fopen(3), stdio(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告 に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。