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



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

守则 :

#include <stdio.h>
int main(void)
{
   int num;
   char a;
   setvbuf(stdin, NULL, _IONBF, 0); //turn off buffering
   scanf("%d", &num);
   a = getchar();
   printf("%d %cn", num , a);
       return 0;
}

问题 :

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

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

3.)那么禁用缓冲区有什么效果呢?是在性能方面吗?

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

例如

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

printf("start ");
sleep(10);
printf("stopn");

将等待 10 秒钟,然后打印start stop [NL]。第一次打印已缓冲,因为没有换行符来刷新缓冲区。要打印start,然后休眠 10 秒,您可以在sleep调用之前添加fflush调用,或者使用 setvbuf 关闭stdout缓冲。

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

相关内容

  • 没有找到相关文章

最新更新