C 使用setvbuf()禁用stdin和stdout的缓冲

C 使用setvbuf()禁用stdin和stdout的缓冲,c,file-io,stream,buffer,stdio,C,File Io,Stream,Buffer,Stdio,当我阅读有关setvbuf()的用法时,我遇到了\u IONBF(无缓冲)模式。所以我很好奇,如果我尝试禁用缓冲,stdin和stdout将受到怎样的影响。下面是一个示例代码: 守则: #包括 内部主(空) { int-num; 字符a; setvbuf(stdin,NULL,_IONBF,0);//关闭缓冲 scanf(“%d”和&num); a=getchar(); printf(“%d%c\n”,num,a); 返回0; } 问题是: 1.)从上面的代码中,我给程序的示例输入(123a等

当我阅读有关
setvbuf()
的用法时,我遇到了
\u IONBF
(无缓冲)模式。所以我很好奇,如果我尝试禁用缓冲,stdin和stdout将受到怎样的影响。下面是一个示例代码:

守则:

#包括
内部主(空)
{
int-num;
字符a;
setvbuf(stdin,NULL,_IONBF,0);//关闭缓冲
scanf(“%d”和&num);
a=getchar();
printf(“%d%c\n”,num,a);
返回0;
}
问题是:

1.)从上面的代码中,我给程序的示例输入(
123a
等)产生相同的输出,即使我没有包含
setvbuf()

2.)据我所知,缓冲区是一个中间存储器,其中可以填充一块数据,当缓冲区满或换行时,所有这些数据都将发送到输入或输出流


3.)那么禁用缓冲区的效果如何?它是性能方面的吗?

它部分是性能,部分是控制流库函数(fread、fgets、fprintf等)与设备/文件的实际I/O之间的关系

例如,到字符设备(例如,您的终端)的流输出在默认情况下是行缓冲的。其效果是,以下代码

printf("start ");
sleep(10);
printf("stop\n");
将等待10秒钟,然后打印
开始-停止
[NL]。第一次打印被缓冲,因为没有新行刷新缓冲区。要使
start
打印,然后睡眠10秒,您可以在
sleep
调用之前添加
fflush
调用,或者使用
setvbuf
关闭
stdout
上的缓冲

默认情况下,到块设备或磁盘文件的流输出是完全缓冲的。这意味着在溢出缓冲区或执行
fflush
之前,缓冲区不会刷新。例如,如果要使用
tail-f
实时监视输出,这可能是文件的问题。如果您知道可以执行此监视,则可以将流缓冲切换到行缓冲,以便每次打印新行时,缓冲都会刷新到文件中。这将以增加开销为代价,因为在打印新行时,磁盘块会被写入几次。(注意:此开销取决于文件系统的装载方式。与可移动驱动器装载的写操作相比,固定驱动器装载的写回缓存在操作系统缓冲区写入磁盘时的开销更小。在后一种情况下,操作系统将尝试进行部分写操作,以提高在不使用缓存的情况下移除驱动器时避免数据丢失的可能性。)拆卸。)

printf("start ");
sleep(10);
printf("stop\n");