[320] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25
掲示板では一般にマルチポストは嫌われます。
ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに
当たるかどうかはわかりません。が、この手の掲示板を見ている人は、同じような
ジャンルの掲示板は見ていることが多い、ということは意識している必要があると
思います。かずまさんも、たまにこの掲示板にも登場されます。
>select関数についての振舞いについて調べています。
端末ドライババッファとstdinバッファの振舞いについて調べるのに、
わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいですが、
getchar()とputchar()でもよいような。
...
>端末ドライバのバッファやstdinバッファの中身を覗くにはどうすれば
>いいのでしょうか?
端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。
標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから
調べればよいでしょう。
私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。
typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
_baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと
想像し(外しているかも)、こんなプログラムを書いてみました。
#include <stdio.h>
void dump_buffer(FILE *fp)
{
int i;
printf("[");
for (i = 0; i < fp->_cnt; i++) {
putchar(fp->_base[i]);
}
printf("]\n");
}
int main(void)
{
int c;
while ((c = getchar()) != EOF) {
dump_buffer(stdin);
putchar(c);
}
}
[実行結果]
C:\ctest>buffertest
aaa
[aaa]
a[aa]
a[a]
a[]
bbb
[bbb]
b[bb]
b[b]
b[]
それっぽく動いているように見えます。
重要なのは、標準入出力ライブラリの関数は、そのバッファリングのメカニズムを
含め、普通にCで、システムコールの上に実装されている、ということです。
実装を想像すると、理解が深まると思います。