不会只用fork()行打破一个程序吗?

时间:2017-05-26 00:46:42

标签: c unix system-calls

#include <unistd.h>
#include <stdio.h>

int main(){

   fork();

   return 0;

}

根据我的理解,fork()将复制父进程,并将其作为子进程运行;如果是这样的话,上面的程序会破坏吗?因为我对这个程序的理解是:上面的程序将无限期地调用fork(),最终导致Stack Overflow。

2 个答案:

答案 0 :(得分:2)

According to the POSIX specification

  

两个进程都将继续从 fork()函数执行。

因此,在调用fork()之后,两个进程都将继续,并且两个进程将立即终止。

答案 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)