我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。
首先,我感到困惑的是,这个伪代码并不是每次迭代都打印输出:
while (1) {
printf("Any text");
sleep(1);
}但是,如果我添加换行符,它就会。
经过几次实验,我发现我的机器上的标准缓冲区是冲的:
第一个条件是完全清楚的-当缓冲区是满的,它应该被冲洗。第二条也是合理的。但是为什么换行符会导致脸红呢?其他的隐含条件是什么?
发布于 2016-09-16 17:09:12
自动刷新标准缓冲区的规则是implementation-defined (ID)。当流未被缓冲、完全缓冲或行缓冲时,它是ID。
当流未缓冲时,字符将尽快从源或目的地出现。否则,字符可以作为块累积和传输到或从主机环境中传输。 当流被完全缓冲时,当缓冲区被填充时,字符将作为块传送到或从主机环境中传输。 当流被缓冲时,当遇到新行字符时,字符将作为块传送到或从主机环境中传输。此外,当缓冲区被填充时,当输入被请求到非缓冲流时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符打算作为块传输到主机环境。 对这些特性的支持是实现定义的,.C11dr§7.21.3 3
我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。
如果代码想确保输出肯定是刷新的,请使用fflush()。可以自动刷新流的其他条件是实现定义的。
发布于 2016-09-16 16:35:36
如果您只需要在输出到终端时才需要刷新,那么假设写换行符会导致刷新就足够了。否则,您应该在需要刷新的地方显式调用fflush。
发布于 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()发送该缓冲区的内容。
https://stackoverflow.com/questions/39536212
复制相似问题