我只是好奇应该满足哪些条件才能自动刷新标准输出缓冲区。
首先,我很困惑这个伪代码不会在每次迭代时打印输出:
while (1) {
printf("Any text");
sleep(1);
}
但如果我添加换行符,它就会。
经过几次实验,我发现在我的机器上标准输出缓冲区被刷新:
- 当我输入 stdout 1025 个字符或更多时;
- 当我读到标准输入时;
- 当我将换行符放入标准输出时;
第一个条件是完全清楚的——当缓冲区已满时,应该刷新它。第二个也有道理。但为什么换行符会导致刷新呢?其他隐含条件是什么?
自动刷新标准输出缓冲区的规则是实现定义的(ID)。流的时候是ID无缓冲的, 全缓冲, or 行缓冲.
当一个流是无缓冲的,字符旨在尽快从源或目的地出现。否则,字符可能会作为块累积并传输到主机环境或从主机环境传输。
当一个流是全缓冲,当缓冲区已满时,字符将作为块传输到主机环境或从主机环境传输。
当一个流是行缓冲,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。此外,当缓冲区已满、在无缓冲流上请求输入或在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。
对这些特性的支持是实现定义的, ... C11dr §7.21.3 3
我只是好奇应该满足哪些条件才能自动刷新标准输出缓冲区。
如果代码想确保输出被刷新,请使用fflush()
。可以自动刷新流的其他条件是实现定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)