猿问
下载APP

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

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

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

首先,我很困惑这个伪代码不会在每次迭代时打印输出:

while (1) {
    printf("Any text");
    sleep(1);}

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

经过几次实验,我发现在我的机器上stdout缓冲区被刷新:

  1. 当我输入1025个字符或更多字符时;

  2. 当我读到标准时;

  3. 当我将换行符添加到stdout时;

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


米脂
浏览 94回答 3
3回答

白衣染霜花

自动刷新stdout缓冲区的规则是实现定义的(ID)。当流是无缓冲,完全缓冲或行缓冲时,它是ID 。当流未缓冲时,字符应尽快从源或目的地出现。否则,可以将字符作为块累积并发送到主机环境或从主机环境发送。当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输。当流被线缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。 。对这些特性的支持是实现定义的,...C11dr§7.21.33我只是好奇应该满足哪些条件来自动刷新stdout缓冲区。如果代码想确保输出肯定是刷新的,请使用fflush()。可以自动刷新流的其他条件是实现定义的。

一只名叫tom的猫

请参阅手册页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()不要缓冲。 

慕斯709654

每当输出换行时,都应刷新行缓冲的输出流。每当从任何行缓冲的输入流尝试读取时,实现可以(但不是必须)刷新所有行缓冲的输出流。默认情况下,不允许实现使流完全缓冲,除非可以确定它们不与“交互设备”相关联。因此,当stdin / stdout是终端时,它们不能完全缓冲,只能进行行缓冲(或无缓冲)。如果您只需要在输出到终端时进行刷新,则可以假设写入换行符会导致刷新。否则,您应该fflush在需要刷新的地方明确调用。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答