为了账号安全,请及时绑定邮箱和手机立即绑定

C中自动stdout缓冲区刷新的规则是什么?

C中自动stdout缓冲区刷新的规则是什么?

C
米脂 2019-08-23 10:29:23
C中自动stdout缓冲区刷新的规则是什么?我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。首先,我很困惑这个伪代码不会在每次迭代时打印输出:while (1) {     printf("Any text");     sleep(1);}但如果我添加换行符,它会。经过几次实验,我发现在我的机器上stdout缓冲区被刷新:当我输入1025个字符或更多字符时;当我读到标准时;当我将换行符添加到stdout时;第一个条件是完全清楚的 - 当缓冲区已满时,应该刷新它。第二个也是合理的。但为什么换行符导致潮红?其他隐含的条件是什么?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

自动刷新stdout缓冲区的规则是实现定义的(ID)。当流是无缓冲完全缓冲行缓冲时,它是ID 。

当流未缓冲时,字符应尽快从源或目的地出现。否则,可以将字符作为块累积并发送到主机环境或从主机环境发送。

当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输。

当流被线缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。 。

对这些特性的支持是实现定义的,...C11dr§7.21.33


我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。

如果代码想确保输出肯定是刷新的,请使用fflush()。可以自动刷新流的其他条件是实现定义的。


查看完整回答
反对 回复 2019-08-23
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

请参阅手册页setbuf(3)。默认情况下,stdout设置为行缓冲模式。

printf()它的变体使用缓冲输出,并委托给write()。因此,此缓冲由C库实现控制printf,缓冲区和缓冲区设置位于FILE结构中。

同样值得注意的是unix手册页的第3节和第2节之间的区别。第2节由直接与操作系统通信的函数调用组成,并执行从纯用户程序无法完成的操作。第3节由用户可以自己复制的函数调用组成,这些函数调用通常委托给第2节调用。第2节函数包含允许C程序与外部世界交互并执行I / O的低级“魔术”。第3节功能可以为第2节功能提供更方便的界面。

printfscanfgetcharfputs,和其他FILE *功能的全部是第3个函数委托write()read(),它们是部2层的功能。read()并且write()不要缓冲。 


查看完整回答
反对 回复 2019-08-23
?
慕斯709654

TA贡献1840条经验 获得超5个赞

  • 每当输出换行时,都应刷新行缓冲的输出流。

  • 每当从任何行缓冲的输入流尝试读取时,实现可以(但不是必须)刷新所有行缓冲的输出流。

  • 默认情况下,不允许实现使流完全缓冲,除非可以确定它们不与“交互设备”相关联。因此,当stdin / stdout是终端时,它们不能完全缓冲,只能进行行缓冲(或无缓冲)。

如果您只需要在输出到终端时进行刷新,则可以假设写入换行符会导致刷新。否则,您应该fflush在需要刷新的地方明确调用。


查看完整回答
反对 回复 2019-08-23
  • 3 回答
  • 0 关注
  • 993 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信