3 回答
TA贡献1796条经验 获得超10个赞
自动刷新stdout缓冲区的规则是实现定义的(ID)。当流是无缓冲,完全缓冲或行缓冲时,它是ID 。
当流未缓冲时,字符应尽快从源或目的地出现。否则,可以将字符作为块累积并发送到主机环境或从主机环境发送。
当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输。
当流被线缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。 。
对这些特性的支持是实现定义的,...C11dr§7.21.33
我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。
如果代码想确保输出肯定是刷新的,请使用fflush()
。可以自动刷新流的其他条件是实现定义的。
TA贡献1906条经验 获得超3个赞
请参阅手册页setbuf(3)
。默认情况下,stdout
设置为行缓冲模式。
printf()
它的变体使用缓冲输出,并委托给write()
。因此,此缓冲由C库实现控制printf
,缓冲区和缓冲区设置位于FILE
结构中。
同样值得注意的是unix手册页的第3节和第2节之间的区别。第2节由直接与操作系统通信的函数调用组成,并执行从纯用户程序无法完成的操作。第3节由用户可以自己复制的函数调用组成,这些函数调用通常委托给第2节调用。第2节函数包含允许C程序与外部世界交互并执行I / O的低级“魔术”。第3节功能可以为第2节功能提供更方便的界面。
printf
,scanf
,getchar
,fputs
,和其他FILE *
功能的全部是第3个函数委托write()
和read()
,它们是部2层的功能。read()
并且write()
不要缓冲。
TA贡献1840条经验 获得超5个赞
每当输出换行时,都应刷新行缓冲的输出流。
每当从任何行缓冲的输入流尝试读取时,实现可以(但不是必须)刷新所有行缓冲的输出流。
默认情况下,不允许实现使流完全缓冲,除非可以确定它们不与“交互设备”相关联。因此,当stdin / stdout是终端时,它们不能完全缓冲,只能进行行缓冲(或无缓冲)。
如果您只需要在输出到终端时进行刷新,则可以假设写入换行符会导致刷新。否则,您应该fflush
在需要刷新的地方明确调用。
- 3 回答
- 0 关注
- 993 浏览
添加回答
举报