#include <unistd.h>
#include <stdio.h>
int main(){
fork();
return 0;
}
根据我的理解,fork()将复制父进程,并将其作为子进程运行;如果是这样的话,上面的程序会破坏吗?因为我对这个程序的理解是:上面的程序将无限期地调用fork(),最终导致Stack Overflow。
答案 0 :(得分:2)
答案 1 :(得分:0)
fork
调用不会使子进程或父进程返回到main
的开头并重新开始。它像普通函数一样返回,但它会在子项中执行两次,在父项中执行一次,具有不同的返回值,因此您可以判断哪个是哪个。
因此,在您的程序中,fork
成功,然后两个进程都继续return 0
并退出。什么都不会发生。
变种 会导致问题:
#include <unistd.h>
int
main(void)
{
for (;;)
fork();
/* not reached */
}
这被称为&#34;叉炸弹&#34;。因为它在无限循环中调用fork
,从不检查它是父进程还是子进程,原始进程变为两个进程,然后是四个进程,然后是八个进程,直到你用完为止RAM,或至少进程ID。并且它也不会检查失败,因此在fork
调用开始失败后它不会停止。所有这些过程将继续永远地咀嚼CPU,并且计算机上运行的其他程序都不能继续前进。
回到猛犸象和SunOS 4的时代,情况甚至更糟,一个叉炸弹会惹恼一个内核虫并彻底崩溃小型机,然后BOFH会来寻找你和他或她不会幸福。我希望现代内核不会崩溃,你甚至可以用control-C终止整个指数过程树,但我不打算只是为了找到它进行。
顺便说一下,return_type whatever()
是C中的错误样式,因为出于历史原因,它意味着whatever
需要任意数量的参数。请务必写下return_type whatever(void)
。