シェル、サブシェル、機能、およびバックグラウンドプロセスに関する私の知識は非常に断片的であるため、このフォーク爆弾の詳細な仕組みを理解するのに自信がありません。
しかし、私が知っていることをあなたに伝えます。
- :() ここで、コロンは珍しい関数名だけです。
- {...} これは、関数が実行する操作を説明します。
- {:()} この関数は、次の繰り返しで自分自身を呼び出します。
- {:()&} この関数は自分自身を呼び出し、次の繰り返しをシェルの背景に入れます。
- ...;: 最後のコロンは関数の実際の実行の開始点であり、前のコロンは定義にすぎません。
だから私が基本的に理解しているのは、これが卵を産む機械のように動作し、システムがもはや社会福祉を広めることができなくなるまで自分のコピーを生成する再帰関数であるということです。
しかし、私は段階的に何が起こっているのかを視覚的に理解していませんでした。
例えば
- :()|:()&2つの関数呼び出しがパイプシンボルにグループ化されるのはなぜですか?
- フォーク爆弾は、1時間あたりのプロセス数が一定の線形方法で生成されますか、それとも2つの関数呼び出しが提案するように指数関数的に増加しますか?
どんなに混乱していても、散乱プロセスのための段階的な視覚漫画をさらに提供できますか?
ベストアンサー1
以下は視覚的な説明です。申し訳ありません。漫画ではありませんが、説明が必要です。
ステップ1:関数を実行する
:
ステップ2:この関数はパイプを使用して2つのコピーを並列に開始して2つのコピーを実行します(答えで述べたように、バックグラウンド演算子はここでは重要ではないようです)。フォーク爆弾はどのように機能しますか?)
(:|:)
(ここでは明確にするために括弧を使用しました)
ステップ3:それぞれについてプロセスを繰り返します。
:
((:|:)|(:|:))
だから続く
(((:|:)|(:|:))|((:|:)|(:|:)))
など、各段階
:
で(:|:)
((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))) (((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))) ((((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))|(((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))))
システムのリソースが不足するまで待ちます(この時点で実際には非常に応答しなくなります)。