So funktioniert eine Gabelbombe: Im C-Code (oder C-ähnlichen Code) wird eine Funktion namens benannt fork()
. Dies führt dazu, dass Linux oder Unix oder Unix-a-Likes einen völlig neuen Prozess erstellen. Dieser Prozess verfügt über einen Adressraum, eine Prozess-ID, eine Signalmaske, offene Dateideskriptoren und alle möglichen Dinge, die Platz im etwas begrenzten Speicher des Betriebssystemkerns beanspruchen. Der neu erstellte Prozess erhält auch einen Platz in der Datenstruktur des Kernels, damit Prozesse ausgeführt werden können. Für den aufgerufenen Prozess fork()
sieht es so aus, als wäre nichts passiert. Ein Gabelbombenprozess wird versuchen, fork()
so schnell wie möglich und so oft wie möglich zu callen.
Der Trick ist, dass der neu erstellte Prozess auch ausfork()
demselben Code stammt. Nach einem Fork haben Sie zwei Prozesse, die denselben Code ausführen. Jeder neue Gabelbombenprozess versucht fork()
so schnell wie möglich zu rufen , so oft er kann. Der Code, den Sie als Beispiel angegeben haben, ist eine Bash-Skript-Version einer Gabelbombe.
Bald sind alle prozessbezogenen Ressourcen des Betriebssystemkerns aufgebraucht. Die Prozesstabelle ist voll. Die Warteliste der Prozesse ist voll. Der reale Speicher ist voll, daher beginnt das Paging. Wenn dies lange genug dauert, füllt sich die Swap-Partition.
Wie das für einen Benutzer aussieht: Alles läuft super langsam. Sie erhalten Fehlermeldungen wie "Prozess konnte nicht erstellt werden", wenn Sie einfache Dinge wie ausprobieren ls
. Der Versuch eines ps
führt zu einer endlosen Pause (wenn überhaupt) und gibt eine sehr lange Liste von Prozessen zurück. Manchmal erfordert diese Situation einen Neustart über das Netzkabel.
Gabelbomben wurden früher "Kaninchen" genannt. Weil sie sich so schnell vermehrten.
Nur zum Spaß habe ich ein Gabelbombenprogramm in C geschrieben:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Ich habe dieses Programm unter Arch Linux in einem xterm kompiliert und ausgeführt. Ich habe ein anderes xterm versucht, eine Prozessliste zu bekommen:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Die Z-Shell im 2. xterm konnte nicht fork()
erfolgreich aufgerufen werden, da die mit dem 1. xterm verknüpften Gabelbombenprozesse alle Kernelressourcen für den erstellten und ausgeführten Prozess aufgebraucht hatten.