fork()如何使用像stdout这样的缓冲流?

use*_*399 3 c linux

请看下面的代码.

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

int main(void)
{

        fork();
        printf(".");
        fflush(stdout);
        fork();
        printf(",");

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

..,,,,
Run Code Online (Sandbox Code Playgroud)

这对我来说没问题,

但是如果我fflush(stdout)从上面的程序中删除那么输出应该是(根据我的理解).

  ...,.,.,.,
Run Code Online (Sandbox Code Playgroud)

陈述fork()是:紧接着后的陈述fork()被复制到父和子.

我的理解是:在第一个fork()之后有两个过程(假设它是过程p和过程c)我们有

进程p和c中的代码是:

    printf(".");
    fork();
    printf(",");
Run Code Online (Sandbox Code Playgroud)

现在,假设执行进程p和c的第一个语句,那么输出将是.

  ..
Run Code Online (Sandbox Code Playgroud)

现在fork()声明来执行.所以,执行后fork(),我们的过程就像p,pc,c,cc​​.

p,pc,c和cc中的每个代码都是

    printf(",");
Run Code Online (Sandbox Code Playgroud)

我们不冲洗,stdout所以printf(".")仍然存在于每个缓冲区中.

所以每个进程都会打印., 输出

 .,.,.,.,
Run Code Online (Sandbox Code Playgroud)

我的问题是:1)以前在哪里.. ?即根据我的解释,输出应该是

                ...,.,.,.,
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 5

由于没有同花顺,所以不会写任何东西.每个forked进程都有".",准备在第二个之后写入printf.

    fork();
Run Code Online (Sandbox Code Playgroud)

我们有两个过程.

    printf(".");
Run Code Online (Sandbox Code Playgroud)

他们每个人都准备写".".

    fork();
Run Code Online (Sandbox Code Playgroud)

我们有四个流程.

    printf(",");
Run Code Online (Sandbox Code Playgroud)

他们每个人现在都准备写".".

    return 0;
Run Code Online (Sandbox Code Playgroud)

当每个进程刷新时,它会写入"." stdout,产生最可能的输出".,.,.,.,".