一个只有 fork() 这行的程序不会自己崩溃吗?

Wouldn't a program with only the line of fork() break itself?

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

int main(){

   fork();

   return 0;

}

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

According to the POSIX specification:

Both processes shall continue to execute from the fork() function.

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

fork 调用不会使子进程或父进程返回到 main 的开头并重新开始。它 return 就像一个普通函数,但它执行了两次,一次在子级中,一次在父级中,具有不同的 return 值,因此您可以分辨哪个是哪个。

因此,在您的程序中,fork 成功,然后两个进程继续进行 return 0 并退出。不会有什么不好的事情发生。

变体 引起问题,但是:

#include <unistd.h>

int
main(void)
{
    for (;;)
        fork();
    /* not reached */
}

这叫做"fork bomb"。因为它在无限循环中调用fork,从不检查它是父进程还是子进程,所以原来的进程变成了两个进程,然后是四个,然后是八个,......直到你运行出来RAM,或者至少是进程 ID。而且它也不检查失败,因此在 fork 调用开始失败后它不会停止。所有这些进程将永远继续 CPU,计算机上 运行 的其他程序 none 将能够继续前进。

回到猛犸象和 SunOS 4 的时代,它甚至比这更糟糕,叉子炸弹很容易引起内核错误并彻底崩溃小型计算机,然后 BOFH 会来寻找你和他或她不会幸福。我希望现代内核不会 崩溃 ,你甚至可以用 control-C 杀死整个指数进程树,但我不会尝试它只是为了找出来。

顺便说一句,return_type whatever() 在 C 中是一种糟糕的风格,因为出于历史原因,这意味着 whatever 接受 任意数量的参数 。始终写 return_type whatever(void)