フォーク爆弾のフォーク()はどこにありますか:(){ :|: & };:?

フォーク爆弾のフォーク()はどこにありますか:(){ :|: & };:?

警告:ほとんどのシェルでこのコマンドを実行すると、システムが破損し、回復に強制シャットダウンが必要です。

私は再帰関数:(){ :|: & };:とその機能を理解しています。しかし、フォークシステムコールがどこにあるのかわかりません。確かではありませんが、パイプの中にあるようです|

ベストアンサー1

のパイプによって、x | yパイプをフォアグラウンドプロセスグループの一部として含むサブシェルが作成されます。これにより、サブシェル(パス)が引き続き生成され、fork()フォーク爆弾が生成されます。

$ for (( i=0; i<3; i++ )); do
>     echo "$BASHPID"
> done
16907
16907
16907
$ for (( i=0; i<3; i++ )); do
>     echo "$BASHPID" | cat
> done
17195
17197
17199

:ただし、ブランチはコードの最後の呼び出しであるコードが実行されるまで実際には発生しません。

フォーク爆弾の解体の仕組み:

  • :()- という新しい関数を定義します。:
  • { :|: & }- 呼び出し関数をバックグラウンド呼び出し関数の別のインスタンスに再帰的に転送する関数の定義
  • :- フォーク爆弾機能を呼び出す

これは多くのメモリを占有しない傾向があるが、PIDを占有し、CPUサイクルを消費する。

おすすめ記事