0

在编写 ac 程序时,我遇到了 printf 和 write 的一个令人费解的行为。似乎在某些情况下 write 是在 printf 之前调用的,即使它在代码中是在它之后(printf 是异步的吗?)。此外,如果 printf 中有两行,则之后的输出似乎插入在它们之间。我的问题是什么导致了这种行为,我怎么知道什么时候会发生什么?其他输出函数(例如 puts)呢?我可以在文档中查找某些内容以了解它们与其他函数的行为方式。示例代码:

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    write(STDOUT_FILENO, "1.", 2);
    printf("2.");
    write(STDOUT_FILENO, "3.", 2);
    printf("4.\n5.");
    printf("6.");
    write(STDOUT_FILENO, "7.", 2);
    return 0;
}

输出:

1.3.2.4.
7.5.6.
4

2 回答 2

4

write不是缓冲printf就是。每当您使用write它时,它都会到达控制台 - 但是printf当它到达\n这里时会输出,因为这样缓冲区就会被刷新。

这就是为什么1.3.你看到之后2.4.

您可以在调用fflush(stdout)后立即使用来刷新输出。printfSteve Summit评论了这个)

你可能想知道在那之后就没有其他\n的了,printf那么为什么这些字符会被刷新呢?

在程序终止时,输出缓冲区也被刷新。这就是导致其余printf输出出现的原因。setvbuf()函数只能在打开流之后和对其执行任何其他操作之前使用。


同样如前所述,您可以在对标准 I/O 函数进行任何其他调用之前zwol关闭使用它的行缓冲。stdout

setvbuf(stdout, 0, _IONBF, 0)
                   ^^^
                   causes input/output to be unbuffered
于 2018-01-06T15:43:16.657 回答
2

除了在每个输出操作之后提到的使用之外,fflush()您还可以stdout 使用

setvbuf(stdout, NULL, _IONBF, 0);

这样,所有printf, puts, putchar, ... 的输出都会按write输出顺序显示(无需在周围撒上大量的 fflush())。

于 2018-01-06T15:57:15.600 回答