我知道stdoutbuffer模式是如何工作的,即:
unbuffered:无缓冲。
line buffered:当遇到换行符时刷新buffer。
block buffered:当缓冲区满时刷新。
我能理解上面的内容。
但是我对stdin缓冲区的工作原理感到困惑,我无法想象当使用三种缓冲区模式之一时会发生什么。
对于三个缓冲区模式,什么时候stdin使用哪种模式?
先谢了。
// test02.c
int main(int argc, char *argv[]){
char ptr[20];
scanf("%s",ptr);
printf("%s\n",ptr);
return 0;
}
//./test02 < log
// in this case,scanf() just read the first line of log file
// can anyone explain how the stdin buffer works?
字符串
1条答案
按热度按时间ztyzrc3y1#
这取决于实现--FILE I/O是如何实现的--这些模式做什么,也包括标准输出。没有任何地方 * 保证 * 设置line buffered实际上会被line buffered。
当在Linux上使用glibc时,当使用普通文件时,下溢读取数据时,读取
_IO_new_file_underflow
在这里被称为https://github.com/lattera/glibc/blob/895ef79e04a953cac1493863bcae29ad85657ee1/libio/fileops.c#L524_IO_SYSREAD (fp, fp->_IO_buf_base, fp->_IO_buf_end - fp->_IO_buf_base);
。它执行单个read
系统调用。你可以按照setbuf来设置缓冲区。然而,实际的答案要有趣得多。考虑下面的C程序,根据第一个参数,这是一个数字1,2或3,使用全缓冲,行缓冲或无缓冲的标准输入流。
字符串
下面的Makefile编译程序并在strace下运行程序,使用bash here字符串输入两行。这样我们就可以看到正在进行的
read
系统调用:型
在以下方面取得成果:
型
设置
_IOFBF
和_IOLBF
只会使用缓冲区10
的大小执行一个read()
。这两个在阅读时工作相同。但是,_IONBF
会执行一个小的read(0, .., 1)
,直到一个换行符。