c - Linux 中 printf ("\n...") 和 printf ("..\n") 之间的输出差异

标签 c linux printf

<分区>

有人可以向我解释为什么这两个相似的代码(\n 位置除外)会导致不同的输出:

#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>

int main()
{
    int pid, i=0;
    printf("Ready to fork\n");
    pid=fork();
    if (pid==0)
    {
        printf("Child starts\n");
        for (i=0; i<1000; i++);
        printf("Child ends\n");
    }
    else
    {
        wait(0);
        for (i=0; i<1000; i++);
        printf("Parent process ends\n");
    }
    return 1;
}

输出:

enter image description here

还有这个:

#include <unistd.h>
#include<sys/wait.h>
#include <stdio.h>

int main()
{
    int pid, i=0;
    printf("\nReady to fork %d", getpid());
    pid=fork();
    if (pid==0)
    {
        printf("\nChild starts %d",getpid());
        for (i=0; i<1000; i++);
        printf("\nChild ends %d", getpid());
    }
    else
    {
        wait(0);
        for (i=0; i<1000; i++);
        printf("\nParent process ends %d", getpid());
    }
    return 1;
}

结果:

enter image description here

我真的找不到任何令人满意的理由来说明为什么对 \n 位置的简单更改会在父程序似乎在 fork 执行完成后重新启动的级别更改程序的输出.

提前谢谢你。

最佳答案

除非程序的输出被重定向到一个文件,printf()ing \n 默认情况下,flushing printf() 内部使用的>用户空间缓冲区

fork() 之前不刷新缓冲区意味着子进程获得了父进程尚未刷新缓冲区的副本。出于这个原因,您会在未打印 \n 的版本中看到两次 Ready to fork,因为调用 printf() 来打印 Ready to fork 在调用 fork() 之前执行。

关于c - Linux 中 printf ("\n...") 和 printf ("..\n") 之间的输出差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49096059/

相关文章:

C结构解引用链效率

c - 如何将服务器绑定(bind)到不同的端口而不是单个端口?

c - 模拟中的 stub 函数

C 编译器忽略 scanf

java - 每行仅打印 10 个输出

c++ - 为什么这段代码在实际的 BCM2837 (pi 3) 上运行时会挂起,但在 qemu 上运行良好

linux - 如何在 Linux 和嵌入式 Linux 上使用本地链接 (RNDIS) 设置自动 IP

linux - linux shell 中的管道管理

python - 在 linux/sbin/ldconfig.real 上安装 opencv-python 时出错 :/usr/lib32/nvidia-384/libEGL. so.1 不是符号链接(symbolic link)

python - 字符串格式化表达式 (Python)