fork() 为什么不会产生无限输出?

6

为什么会出现

int main(...) {  
    fork();  
    printf("hello again\n");  
    exit(0);  
}

如何避免无限创建进程?我的理解是,主进程创建子进程,子进程再创建另一个子进程,以此类推。


你必须将 fork() 放在一个无限循环中,才能获得无限的进程分支。 - Hristo Iliev
1
@HristoIliev 虽然循环可以是隐式的..但想象一下在 exit 上面有一个 exec - user166390
尝试这个:int main() {fork();main();} - Emanuele Paolini
1
@pst,仔细想想,原帖的作者可能认为fork()会从头开始启动可执行文件,就像if (!fork()) { execl(argv[0],argv[0],NULL); }这样。 - Hristo Iliev
我不想有一个无限循环,我只是不明白为什么这不是一个无限循环。现在我明白了。 - user1324258
2个回答

7
执行fork后,父进程和子进程都会继续执行,而不会重新启动程序。

2
现在,如果有一个后续的 exec 呢 :D - user166390
啊,当我到处阅读克隆整个进程的内容时,我认为父进程被克隆并从头开始。 - user1324258
1
那并不是克隆整个进程。进程知道它当前所在的代码位置,因此也会被克隆。实际上,它只是将整个父进程复制到一个新进程中;在子进程分叉时,两个进程将处于相同的状态。 - Femaref
当整个进程被克隆时,进程的堆栈、执行上下文、指令指针等也会被克隆。所有这些定义了运行进程的状态,因此在调用fork()后,分叉出的子进程将具有与父进程相同的状态。这只是一些背景信息 :) - Andreas Grapentin

3

在调用fork()的执行点上,父进程会被“克隆”,两个进程从那时起同时运行。子进程不会再次调用main()函数以重新开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接