小智 3
Fork 炸弹的工作原理:在 C(或类 C)代码中,fork()
调用一个名为的函数。这会导致 linux 或 Unix 或 Unix-a-likes 创建一个全新的进程。这个进程有一个地址空间、一个进程ID、一个信号掩码、打开的文件描述符,以及占用操作系统内核有限内存中空间的所有东西。新创建的进程还在内核的数据结构中获得一个位置以供进程运行。对于调用的进程来说fork()
,看起来好像什么也没发生。分叉炸弹进程会尝试fork()
尽可能快地调用、尽可能多次地调用。
诀窍在于新创建的进程也会从相同的代码中返回。fork()
分叉后,您将有两个进程运行相同的代码。每个新的分叉炸弹进程都会尝试fork()
尽可能快地调用、尽可能多次地调用。您作为示例给出的代码是 fork 炸弹的 Bash 脚本版本。
很快,所有操作系统内核的进程相关资源都被用完。进程表已满。等待运行的进程列表已满。实际内存已满,因此分页开始。如果这种情况持续足够长的时间,交换分区就会被填满。
对于用户来说,这是什么样的:一切都运行得非常慢。当您尝试诸如ls
. 尝试 aps
会导致无休止的暂停(如果它运行的话)并返回一个很长的进程列表。有时这种情况需要通过电源线重新启动。
叉子炸弹在过去曾被称为“兔子”。因为它们的繁殖速度太快了。
只是为了好玩,我用 C 语言编写了一个 fork 炸弹程序:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在 Arch Linux 下的一个 xterm 中编译并运行了该程序。我在另一个 xterm 中尝试获取进程列表:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
第二个 xterm 中的 Z shell 无法fork()
成功调用,因为与第一个 xterm 关联的 fork 炸弹进程已耗尽与创建和运行的进程相关的所有内核资源。