栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在重定向到文件时stdout需要显式刷新?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在重定向到文件时stdout需要显式刷新?

刷新

stdout
取决于其缓冲行为。可以将缓冲设置为三种模式:(
_IOFBF
完全缓冲:等待,直到
fflush()
可能),
_IOLBF
(行缓冲:换行符触发自动刷新)和
_IONBF
(始终使用直接写)。“对这些特性的支持是由实现定义的,并且可能会受到
setbuf()
setvbuf()
功能的影响。”
[C99:7.19.3.3]

“在程序启动时,三个文本流是预先定义的,无需显式打开-
标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流没有被完全缓冲;标准输入和标准输出流被完全缓冲,当且仅当可以确定该流不引用交互式设备时。”
[C99:7.19.3.7]

观察者行为的解释

因此,发生的事情是该实现做了特定于平台的操作,以确定是否

stdout
要进行行缓冲。在大多数libc实现中,该测试是在首次使用流时完成的。

  1. 行为#1很容易解释:当流用于交互式设备时,它是行缓冲的,并且
    printf()
    会自动刷新。
  2. 现在也可以想到案例2:当我们重定向到文件时,该流将被完全缓冲
    fflush()
    ,除非使用,否则将不会刷新该流,除非您向其写入大量数据。
  3. 最后,对于只对基础fd执行一次检查的实现,我们也理解情况#3。因为我们在第一个中强制将stdout的缓冲区初始化,所以
    printf()
    stdout获得了行缓冲模式。当我们换掉fd进入文件时,它仍然是行缓冲的,因此数据会自动刷新。

一些实际的实现

每个libc都具有如何解释这些要求的自由度,因为C99没有指定“交互设备”是什么,POSIX的stdio条目也没有对此进行扩展(除了要求打开stderr以便读取之外)。

  1. Glibc。参见filedoalloc.c:L111。在这里,我们用于

    stat()
    测试fd是否为tty,并相应地设置缓冲模式。(这是从fileops.c中调用的。)
    stdout
    最初有一个空缓冲区,并根据fd 1的特性在第一次使用流时分配它。

  2. BSD库 非常相似,但是要遵循的代码更简洁!请在makebuf.c中查看此行



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/408657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号