关于 c:Linux 中 printf(“\ …”) 和 printf(“..\ “) 的输出差异

Difference in Output between printf("\n...") and printf("..\n") in Linux

本问题已经有最佳答案,请猛点这里访问。

谁能解释一下为什么这两个相似的代码(除了 \
位置)会导致不同的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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

提前谢谢你。


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

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

之前执行的