fork()的不同输出

aka*_*ash 2 c fork system-calls

任何人都可以解释为什么输出

main()   
{   
    printf("hello ");   
    fork();   
    printf("hello ");   
}
Run Code Online (Sandbox Code Playgroud)

是:

你好你好你好你好

和输出:

main()   
{   
    printf("hello\n");   
    fork();   
    printf("hello ");   
}
Run Code Online (Sandbox Code Playgroud)

是:

你好
你好你好

什么区别会使wrt缓冲?

cni*_*tar 7

当您fork复制进程的内存时.这包括stdio缓冲区,因此如果hello停留在缓冲区中,它将由两个进程打印.这两个过程继续关于他们的业务,并最终刷新他们的缓冲区,你看到两次"你好".

现在在大多数实现中, stdout是行缓冲的,这意味着\n触发刷新.所以当fork发生这种情况时,缓冲区是空的.防止这种情况的可靠方法是在分叉之前冲洗所有东西.

编辑

那么为什么hello在第二个输出的第二行出现两次

现在有两个进程(父进程和子进程)执行相同的代码,因此printf执行两次.