- 警告本番システムでこのプログラムを実行しないでください。
読書トピックに関するウィキペディアページ私は通常、次のコードで何が起こるのかに従います。
:(){ :|:& };:
説明抜粋
以下のフォーク爆弾は2002年に芸術品として展示されました。56 正確なソースは不明ですが、2002年以前にUsenetに存在していました。爆弾は次の13文字を貼り付けて作られました。 Unixシステム殻はまるで強く打つまたは扱いにくい。これは、自分自身を2回(フォアグラウンドで1回、バックグラウンドで1回)呼び出す関数「:」を定義することで機能します。
しかし、この最後のポイントは私にとって完全には明確ではありません。関数定義が表示されます。
:(){ ... }
しかし、何が起こりましたか?他の殻(例えば、、、、、ksh
などcsh
)もtcsh
同じ運命を経験し、同様のものを作ることができますか?
答え1
このフォーク爆弾は、私が初めての授業を聞いた時、人工知能プログラミング先生が「再帰を理解するには、まず再帰を理解しなければならない」と言われた言葉を常に思い出させます。
基本的に、この爆弾は再帰的機能。本質的に、システムリソースが消費されるまで自分自身を呼び出し、呼び出し、呼び出す関数を作成します。この特定のインスタンスでは、パイプを使用して関数をそれ自体に渡し、それをバックグラウンドに配置することによって再帰が増幅されます。
私はこの答えを見ました。スタックオーバーフロー、私はそこに与えられた例がこれを最もよく説明すると思います。単にそれが何をしているのか一目でわかりやすくなるからです(上記のリンクから得たものです...)
☃(){ ☃|☃& };☃
本文が自分自身を呼び出すバグ関数☃() { ... }
(バグ関数)を定義し、出力を自分自身にパイプし(バグ関数) ☃|☃
、結果をバックグラウンドに入れます&
。その後、関数定義後に実際にバグ関数が呼び出されます; ☃
。
少なくとも私のArch VMは、プロセスをバックグラウンドに配置する必要があるときに利用可能なすべてのプロセススペースを消費し、ホストをレンダリングするのと同じ最終結果は必要ないことに気づきました。実際、これまでに述べたように、ランアウェイプロセスは時々終了するように見え、画面が表示された後はbashコアダンプ-bash: fork: Resource temporarily unavailable
で停止します。Terminated
journalctl
csh / tcshに関する質問に答えるには、これらのシェルのどれも機能をサポートしておらず、エイリアスのみを使用できます。したがって、これらのシェルの場合は、自分自身を再帰的に呼び出すシェルスクリプトを作成する必要があります。
zshはコアダンピングではなく同じ運命(同じコードを使用)を経験し、ArchがOut of memory: Kill process 216 (zsh) score 0 or sacrifice child.
。しばらくするとそれは主張しますKilled process 162 (systemd-logind) ...
(そしてまだフォークされたzshを持っています)。
Archにはkshバージョンがないようで、pacman
Debianで試してみました。 kshは関数名に反対します:
が、-sayのようなものを使用するとb()
望ましい結果が得られるようです。