请看下面的代码.
#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)
由于没有同花顺,所以不会写任何东西.每个fork
ed进程都有".",准备在第二个之后写入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
,产生最可能的输出".,.,.,.,".