繁体   English   中英

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

[英]Disable buffering for stdin and stdout using setvbuf()

当我读到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 %c\n", num , a);

       return 0;
}

问题:

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

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

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

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

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

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

将等待10秒然后打印start stop [NL]。 第一个打印是缓冲的,因为没有新行来刷新缓冲区。 start打印,然后睡10秒,您可以在sleep呼叫之前添加fflush呼叫,或者使用setvbuf关闭stdout上的缓冲。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM