1

这个程序打印 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;
}
4

2 回答 2

14

它不是递归的,也不会无限期地分叉。这就是它不分叉炸弹的原因。Fork 不会导致main被调用。fork 所做的是创建当前进程状态的副本,并从 fork 调用中将 0 返回给子副本,并将进程 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"
于 2012-11-29T19:03:43.053 回答
1

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

所以,fork()-1 被调用,并返回两次(一个在父级,一个在子级)。他们都转到下一个语句。

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

然后 fork()-3 被调用,这次是 4 次,8 次返回。它们都打印出来,然后您将所有“hihihihihihihihi”都发送到您的屏幕上。

请查看fork的手册页。

于 2012-11-29T19:06:25.480 回答