c - write 和 printf 乱序输出

标签 c printf output order-of-execution

在编写 C 程序时,我遇到了 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.

最佳答案

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

这就是为什么在 1.3. 之后您会看到 2.4.

您可以在 printf 调用后立即使用 fflush(stdout) 刷新输出。 (Steve Summit 对此发表了评论)

您可能想知道 printf 之后没有其他 \n 那么为什么这些字符会被刷新?

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


此外,正如 zwol 提到的,您可以在对标准 I/O 函数进行任何其他调用之前使用它关闭 stdout 的行缓冲。

setvbuf(stdout, 0, _IONBF, 0)
                   ^^^
                   causes input/output to be unbuffered

关于c - write 和 printf 乱序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128912/

相关文章:

c - c中范围-5到5的数组的算术平均值

html - 如何使用 libMongoose/Embedded Mongoose 发送 HTML 和图像?

c - 显示一些小数位 C

textarea - 换行符在 Textarea 输出中不起作用

mysql - 如何使用 mysql cmdline 获取受影响记录的数量,仅此而已?

c - C scanf ("%c") 函数逐个读取字符的问题

关闭 telnet session 会将 stdout 重定向到 http 套接字

c - 使用 ptrace 抓取所有 printfs

C格式字符串问题

Angular 2 - 如何从父级触发子级的方法