首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的标准缓冲区自动刷新规则是什么?

问C语言中的标准缓冲区自动刷新规则是什么?
EN

Stack Overflow用户
提问于 2016-09-16 16:28:17
回答 5查看 4.2K关注 0票数 13

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

首先,我感到困惑的是,这个伪代码并不是每次迭代都打印输出:

代码语言:javascript
复制
while (1) {
    printf("Any text");
    sleep(1);
}

但是,如果我添加换行符,它就会。

经过几次实验,我发现我的机器上的标准缓冲区是冲的:

  1. 当我把标准的1025字符或更多;
  2. 当我读史丁时;
  3. 当我把换行符放进标准时;

第一个条件是完全清楚的-当缓冲区是满的,它应该被冲洗。第二条也是合理的。但是为什么换行符会导致脸红呢?其他的隐含条件是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-09-16 17:09:12

自动刷新标准缓冲区的规则是implementation-defined (ID)。当流未被缓冲、完全缓冲或行缓冲时,它是ID。

当流未缓冲时,字符将尽快从源或目的地出现。否则,字符可以作为块累积和传输到或从主机环境中传输。 当流被完全缓冲时,当缓冲区被填充时,字符将作为块传送到或从主机环境中传输。 当流被缓冲时,当遇到新行字符时,字符将作为块传送到或从主机环境中传输。此外,当缓冲区被填充时,当输入被请求到非缓冲流时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符打算作为块传输到主机环境。 对这些特性的支持是实现定义的,.C11dr§7.21.3 3

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

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

票数 15
EN

Stack Overflow用户

发布于 2016-09-16 16:35:36

  • 在输出换行符时,应刷新行缓冲的输出流.
  • 每当尝试从任何行缓冲输入流读取时,实现可以(但不需要)刷新所有行缓冲的输出流。
  • 默认情况下,实现不允许使流完全缓冲,除非可以确定它们与“交互设备”无关。因此,当stdin/stdout是终端时,它们不能完全缓冲,只能行缓冲(或未缓冲)。

如果您只需要在输出到终端时才需要刷新,那么假设写换行符会导致刷新就足够了。否则,您应该在需要刷新的地方显式调用fflush。

票数 5
EN

Stack Overflow用户

发布于 2016-09-16 16:36:04

见setbuf(3)。默认情况下,stdout设置为行缓冲模式。

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

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

printf、scanf、getchar、fputs和其他FILE *函数都是委托给write()和read()的第3节函数,后者是第2节函数。read()和write()不缓冲。printf()与FILE结构中的缓冲区进行交互,并偶尔决定通过write()发送该缓冲区的内容。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39536212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档