为什么这不会导致叉炸弹

时间:2012-11-29 18:41:03

标签: recursion fork

此程序打印2 ^ 3次hi和退出 是不是fork调用以递归方式调用main函数?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    fork();
    fork();
    fork();

    puts("hi");

    return 0;
}

2 个答案:

答案 0 :(得分:13)

它不是递归的,它不会无限期地分叉。这就是为什么它不会炸弹。 Fork不会导致main被调用。 fork的作用是创建当前进程状态的副本,并将0 从fork调用返回到子副本,将进程id返回给父副本。

通过您的程序,它会创建7份原始副本,总共可以拨打8次puts("hi")

original   copy 1    copy 2    copy 3    copy 4    copy 5    copy 6    copy 7 
fork 1 --> created
fork 2 ------------> created
fork 3 ----------------------> created
"hi"                           "hi"
            fork 2 --------------------> created
            fork 3 ------------------------------> created
            "hi"                                   "hi"
                     fork 3 -------------------------------> created
                     "hi"                                    "hi"
                                         fork 3 ----------------------> created
                                         "hi"                           "hi"

答案 1 :(得分:1)

你自己回答了。 fork()不调用main()。一个进程调用fork()但两个进程返回(好吧,我们假设没有错误)

因此,fork() - 1被调用,并返回两次(一个在父级,一个在子级)。他们都转到下一个声明。

然后fork() - 2被调用两次(一个在父级,一个在子级),两个调用都返回两次,同样,一个在父级中,一个在子级(ren)。

然后调用fork() - 3,这次是4次,8次返回。他们都打印出来,你把所有'hihihihihihihihi'发送到你的屏幕。

请查看fork的手册页。