14

ウィキペディアによると、forkbomb:(){ :|:& };:は zsh コマンドで停止できます。このコマンドwhile (sleep 100 &!) do; doneは、すべての forkbomb プロセスがなくなるまでスリープ 100 プロセスを生成すると考えられています。これは魔法のようです。それはどのように機能しますか?特に気になるのは、「&!」とは何なのかということです。意味。

同等のコマンドは bash ではどのようになりますか?

4

4 に答える 4

11

フォークボムが機能する理由は、一度に実行できるプロセスの数に有限の制限があり、フォークボムがこの制限を満たすように設計されているためです。

提供したforkbombコードは、子プロセスを生成できない場合に停止するため、親プロセスは実際にはハングしませんが、子が新しい孫*を作成し続けるという事実により、プロセステーブルはいっぱいになります。

そのため、スリープソリューションは、短時間だけスリープする一部のプロセスに潜入するように設計されており、作成されたスリーププロセスごとに、発生するフォーク爆弾が少なくなります。最終的に、スリーププロセスはプロセステーブル自体をいっぱいにし、フォーク爆弾は消滅します。

プロセステーブルが完全にオフになると、スリーププロセスはwhileループを強制終了でき、スリープ時間が経過するとスリーププロセスは終了します。問題は解決しました。

すでに述べたように、zshコマンドの重要な部分はバックグラウンド&で実行されるため、bashコマンドは基本的に他の回答と同じになります。

while (sleep 100 &) do; done

スリープ時間内にログアウトしたい場合を除いて、nohup/の部分は重要ではないと思いますが、間違っていれば正直に設定できれば幸いです。!

于 2009-02-22T12:02:45.327 に答える
8

最初にフォーク爆弾を書くことができます:

foo()
{
    foo|foo&
}
foo

これにより、少し明確になります-各反復は2つのサブプロセスを開始し、その後終了します。そのため、フォークが失敗した場合、ハングアップすることはありません。

したがって、フォークを一時的に失敗させるだけです。したがって、スリープ プロセスが行うように、100 スリープしてプロセス スペースを占有するプロセスを作成します。

zsh&!は似&ていますが、新しいプロセスを所有していません(ログオフ時に強制終了しません)-この例ではおそらく重要ではありません。(取説) と交換できますnohup

したがって、バッシュ:

while (nohup sleep 100 &) do; done

動作するはずです。

于 2009-02-22T10:45:14.717 に答える
6

私はウィキペディアの記事のその部分を書いた男です (そして、私のシステムで誤ってフォーク爆弾を起動した後にこの治療法を「発見」したのも!)。

「&!」の理由 「&」の代わりに、実際には、zsh が新しいプロセスをジョブ制御するのを防ぎます。つまり、いつ終了したかを気にしようとします。試してみたときにジョブ制御が問題だった理由を正確には覚えていませんが、問題はありました。実際に試してみて、「治癒」がどのように機能するか、およびジョブ制御を防止しないとどうなるかを確認できます。ジョブ制御の問題は、bash には存在しない zsh のバグに関係している可能性があり、zsh にも関係がなくなっている可能性があります。

したがって、bash で "&" だけを試してみてください。ジョブ制御が干渉している場合は、それを無効にしてみてください ("set +m")。

ウィキペディアの記事はおそらく zsh に依存してはならないというのはあなたの言うとおりです。

于 2009-06-28T07:34:51.840 に答える
2

とても興味深い質問です!

そのウィキペディアの記事によると、完全なコマンドの目的は、フォーク爆弾を無効にする多くの無害なジョブを作成することです。これは、それ以上の子を生成できなくなるためです。

zshマニュアルによると、

ジョブが &!' で開始された場合、&|' orそのジョブはすぐに破棄されます。起動後は、ジョブ テーブルに配置されず、ここで説明するジョブ制御機能の対象にはなりません。

bashで同じことを達成する方法がわかりません。ただし、次のようなことができる場合があります。

nohup sleep 100 &
于 2009-02-22T10:42:34.893 に答える