执行fork()的过程

时间:2013-09-20 05:19:11

标签: c fork

我执行了以下代码:

#include<stdio.h>

int main()
{
    printf("hello \t");
    fork();
    fork();

   return 0;
}

输出:hello hello hello hello

这是否意味着fork()创建子进程代码的精确副本与父进程的代码完全相同,除了执行的fork()调用被消除了?

这让我感到困惑,因为我研究过“fork()从代码的下一行开始执行”。所以,如果这是真的那么它应该创建3个子进程和1个父进程,并且应该只打印"hello"一次。

请解决此问题。

我在gcc编译器上运行了这段代码。

2 个答案:

答案 0 :(得分:4)

那是因为字符串“hello”存储在父进程的输出缓冲区中。

printf在遇到\n时刷新缓冲区,否则仅在缓冲区已满时打印输出字符串。

默认情况下,子进程继承父进程的缓冲区,因此如果没有刷新缓冲区,子进程的缓冲区也包含“hello”。

如果:

#include<stdio.h>

int main()
{
    printf("hello \n");
    fork();
    fork();

   return 0;
}

你只会看到一个“你好”。

答案 1 :(得分:1)

这是因为printf ...你说使用printf(“hello \ n”)以便在换行符后刷新缓冲区,或者你可以在你的代码中使用fflush(stdout)并且输出只是一个你好...