Linux中printf(“\ n ...”)和printf(“.. \ n”)之间的输出差异[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

有人可以向我解释为什么这两个相似的代码(除了\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执行完成后父级程序似乎重新启动的级别上改变了程序的输出。

先感谢您。

c linux printf
1个回答
2
投票

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

fork()暗示子进程获得父进程尚未刷新的缓冲区的副本之前,不刷新缓冲区。出于这个原因,你在版本中看到Ready to fork两次没有打印\n,因为调用printf()打印Ready to fork是在调用fork()之前执行的。

© www.soinside.com 2019 - 2024. All rights reserved.