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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]相关的知识,希望对你有一定的参考价值。

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

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

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

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

输出:

enter image description here

还有这个:

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

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

结果是:

enter image description here

我真的找不到任何令人满意的理由为什么 的位置的简单改变在fork执行完成后父级程序似乎重新启动的级别上改变了程序的输出。

先感谢您。

答案

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

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

以上是关于Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Printf()和Scanf()的*修饰符

linux 中printf的使用

第六周

实验五

实验五

C语言实现计算器