このフォーク爆弾は、AIプログラミングの教師が「再帰を理解するには、まず再帰を理解する必要がある」という最初のレッスンの1つで言ったことをいつも思い出させます。
基本的に、この爆弾は再帰的な機能です。本質的に、システムリソースが消費されるまで、自分自身を呼び出し、自分自身を呼び出し、自分自身を呼び出す関数を作成します。この特定の例では、関数をそれ自体にパイピングし、それをバックグラウンド化することにより、再帰が増幅されます。
StackOverflowでこれが回答されているのを見てきましたが、それが一目でわかりやすいからです(上のリンクから盗まれた...)
☃(){ ☃|☃& };☃
☃() { ... }
本体がそれ自体を呼び出すバグ関数(バグ関数)、出力をそれ自体にパイピング(バグ関数)し ☃|☃
、結果をバックグラウンド化するバグ関数を定義し&
ます。次に、関数が定義された後、実際にバグ関数を呼び出します; ☃
。
少なくとも私のArch VMでは、プロセスをバックグラウンドにする必要は、同じ最終結果を得るため、利用可能なすべてのプロセススペースを消費し、ホストをb0rkedにするための要件ではないことに注意してください。実際に、私は時々暴走プロセスを終了するように見えると言いました、そしてそれのスクリーンフル-bash: fork: Resource temporarily unavailable
が停止すると停止しますTerminated
(そしてjournalctl
bashコアダンプを示します)。
csh / tcshについての質問に答えるために、これらのシェルはどちらも機能をサポートしていないため、エイリアスしかできません。そのため、これらのシェルでは、自分自身を再帰的に呼び出すシェルスクリプトを作成する必要があります。
zshは同じ運命(同じコード)に苦しんでいるようで、コアダンプせず、Archにを与えますOut of memory: Kill process 216 (zsh) score 0 or sacrifice child.
が、それでも分岐を続けます。しばらくすると、状態Killed process 162 (systemd-logind) ...
が示されます(そして、依然としてフォークzshが続きます)。
Archにはpacman
kshのバージョンがないようですので、代わりにdebianで試してみる必要がありました。kshオブジェクトを:
関数名として使用しますが、何かを使用すると、b()
代わりに望ましい結果が得られるようです。