代码之家  ›  专栏  ›  技术社区  ›  Filip Spasovski

fork()从何处开始[重复]

  •  3
  • Filip Spasovski  · 技术社区  · 6 年前

    据我所知,fork创建了一个调用它的进程的副本,但它也复制了它的程序计数器,所以它从调用后的行继续,但为什么这个代码在fork之前打印hello world两次

    #include <stdio.h>
    #include <sys/wait.h>
    int main()
    {
        printf("Hello World");
    
        fork();
    
        wait(NULL);
        return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Chris Dodd    6 年前

    printf 实际上并没有打印--它实际上只是将数据放入缓冲区,以便稍后打印。当缓冲区被刷新时,它实际上会被打印出来,这种情况可能会以多种方式发生。

    在您的例子中,缓冲区刷新直到fork之后才会发生,因此父级和子级在fork时都有一个字符串的副本要在缓冲区中打印,最后都打印出来。