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

时间:2018-03-04 13:42:23

标签: 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执行完成后父级程序似乎重新启动的级别上更改程序的输出。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

除非程序的输出被重定向到文件,否则printf() \n默认情况下会在刷新 用户空间缓冲区中产生printf()内部使用。

fork()暗示子进程获取父进程尚未刷新的缓冲区的副本之前,不刷新缓冲区。因此,您在未打印Ready to fork的版本中看到\n两次,因为在调用{{1}之前调用printf()打印Ready to fork }。