Diese Gabelbombe erinnert mich immer an etwas, was ein KI-Programmierlehrer in einer der ersten Lektionen sagte, an denen ich teilgenommen habe: "Um Rekursion zu verstehen, muss man zuerst Rekursion verstehen."
Diese Bombe ist im Kern eine rekursive Funktion. Im Wesentlichen erstellen Sie eine Funktion, die sich selbst aufruft, die sich selbst aufruft, die sich selbst aufruft ... bis Systemressourcen verbraucht sind. In diesem speziellen Fall wird die Rekursion verstärkt, indem die Funktion an sich selbst weitergeleitet UND im Hintergrund dargestellt wird.
Ich habe gesehen, dass dies auf StackOverflow beantwortet wurde , und ich denke, dass das dort angegebene Beispiel es am besten veranschaulicht, nur weil es einfacher ist, auf einen Blick zu sehen, was es tut (gestohlen vom obigen Link ...)
☃(){ ☃|☃& };☃
Definieren Sie die Fehlerfunktion ☃() { ... }
, deren Hauptteil sich selbst aufruft (die Fehlerfunktion), die Ausgabe an sich selbst weiterleitet (die Fehlerfunktion) ☃|☃
und das Ergebnis im Hintergrund &
. Rufen Sie dann, nachdem die Funktion definiert wurde, tatsächlich die Fehlerfunktion auf ; ☃
.
Ich stelle fest, dass zumindest auf meiner Arch-VM die Notwendigkeit, den Prozess im Hintergrund auszuführen, keine Voraussetzung dafür ist, dass dasselbe Endergebnis erzielt wird, der gesamte verfügbare Prozessspeicher belegt und der Host blockiert wird. Eigentlich habe ich jetzt gesagt, dass es manchmal den Run-Away-Prozess zu beenden scheint und nach einem Screenful -bash: fork: Resource temporarily unavailable
mit einem Terminated
(und journalctl
zeigt bash core dumping) aufhört .
Um Ihre Frage zu csh / tcsh zu beantworten, unterstützt keine dieser Shells Funktionen. Sie können nur einen Aliasnamen verwenden. Für diese Shells müssten Sie also ein Shell-Skript schreiben, das sich selbst rekursiv aufruft.
zsh scheint dasselbe Schicksal zu erleiden (mit demselben Code), entleert den Kern nicht und veranlasst Arch, zu geben Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, aber es gibt sich weiterhin. Nach einer Weile heißt es dann Killed process 162 (systemd-logind) ...
(und hat immer noch eine Gabelung zsh).
Arch scheint keine pacman
Version von ksh zu haben, also musste ich es stattdessen mit Debian versuchen. ksh Objekte :
als Funktionsname, aber mit etwas - sagen b()
stattdessen scheint das gewünschte Ergebnis zu haben.