- 警告これを実稼働マシンで実行しようとしないでください
このトピックに関するウィキペディアのページを読むとき、私は通常、次のコードで何が起こっているかを追跡します。
:(){ :|:& };:
説明の抜粋
次のフォーク爆弾は2002年にアートとして提示されました;56
正確な起源は不明ですが、2002年より前にUsenetに存在していました。
爆弾は次の13文字をaに貼り付けることによって実行されます
bashやzshなどのUNIXシェル。
「:」と呼ばれる関数を定義することで動作します。この関数は、
フォアグラウンドで1回、バックグラウンドで1回、計2回呼び出します。
しかし、最後の部分は私には完全には明らかではありません。関数の定義が表示されます:
:(){ ... }
しかし、他に何が起こっているのでしょうか? ksh
などの他のシェルも実行します 、csh
、およびtcsh
同様の何かを構築できるという同じ運命にも苦しんでいますか?
承認された回答:
このフォーク爆弾は、私が最初に参加したレッスンの1つで、AIプログラミングの先生が「再帰を理解するには、まず再帰を理解する必要があります」と言ったことを常に思い出させます。
本質的に、この爆弾は再帰関数です。本質的には、自分自身を呼び出す関数、自分自身を呼び出す関数、自分自身を呼び出す関数を作成します…。システムリソースが消費されるまで。この特定の例では、関数をそれ自体にパイプし、バックグラウンドで処理することにより、再帰が増幅されます。
私はこれがStackOverflowで回答されているのを見てきましたが、そこに示されている例は、それが何をしているのかが一目でわかりやすいという理由だけで、最もよく示されていると思います(上のリンクから盗まれました…)
☃(){ ☃|☃& };☃
バグ関数を定義する☃() { ... }
、本体がそれ自体を呼び出し(バグ関数)、出力をそれ自体にパイプします(バグ関数)☃|☃
、結果のバックグラウンド&
。次に、関数を定義した後、実際にバグ関数; ☃
。
少なくとも私のArchVMでは、プロセスをバックグラウンドで処理する必要はなく、同じ最終結果を得て、使用可能なすべてのプロセススペースを消費し、ホストを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で試してみる必要がありました。 :
関数名として使用しますが、何かを使用します– b()
と言います 代わりに、望ましい結果が得られているようです。