一个只有 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)
。
#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)
。