Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で比較するBASHフォーク爆弾とC実装の違い

BASHフォーク爆弾はなぜC版より強力なのか

すでに広く知られているように、BASHで書かれたフォーク爆弾(fork bomb)は、C言語で実装されたものよりもはるかに強力です。その主な原因は、BASHでは生成されたプロセスが親プロセスから切り離される(デタッチされる)点にあります。

つまり、最初に起動した親プロセスが破壊されたりkillされたりしても、残りの子プロセスは生き続けます。一方、C言語による実装の場合、親プロセスが破壊または終了されると、それに紐づく子プロセスも自動的に終了してしまいます。これは、スクリプトがシステムと直接やり取りを行う構造になっているためです。

C版フォーク爆弾を改良するアイデア

ただし、C言語のフォーク爆弾プログラムも改良・変更することは可能です。例えば、fork()で子プロセスを生成するタイミングでメモリを割り当てることで、CPU負荷だけでなくメモリ消費量も増大させることができます。

改良版Cフォーク爆弾の実装例

以下のプログラムは、fork()のたびにRAM上へメモリを確保するよう修正したフォーク爆弾の実装例です。

// 改良版フォーク爆弾
#include <unistd.h>
#include <malloc.h>
int main(){
    // 無限ループ
    while (1){
        // 子プロセスを生成
        fork();
        // RAM上にメモリを割り当てる
        int *p1 = (int *) malloc (sizeof (int) * 100000);
    }
}

注意点

フォーク爆弾はシステムリソースを瞬時に枯渇させる危険性のあるコードであり、学習目的以外での実行は絶対に行わないでください。テスト環境で動作を確認する場合でも、ulimitなどでプロセス数やメモリ使用量の上限を設定し、必ず隔離された環境で行うことを推奨します。

  1. C/C++のmemcpy()関数の使い方と実例解説

    この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ