2017-12-09 19 views
-1

私のCSコースの1つに与えられた課題では、停止するのが非常に難しいフォークボンブを作成することが任されています。高度なforkbombがkillシグナルに免疫されない

免疫制御-c、制御-z、制御-dで端末を閉じる必要があります。それはsigkillとシグナル9から免れなければなりません、私たちはsigsegvですぐにシグナル処理を行ってしまったが、それはすべてだった。私はsigactionがsigkillまたはsigstopシグナルを捕まえることができないことを読んだ。

私はプロセスをバックグラウンドで実行できるようにするというデーモンを読んで、ターミナルを閉じてもそれを止めることはできません。

フォークボンベプロセスをシグマ信号に耐性を持たせるにはどうすればよいですか?

これは前に作ったフォーク爆弾です。

#include<unistd.h> 

int main(){ 

    while(1){ 
     fork(); 
    } 
    return 0; 
} 

また、私はこれを安全にテストするためにバーチャルボックスを使用しています。

+4

プロセスをSIGKILLシグナルから保護することはできません。それは常に致命的です。しかし、あなたができることは、フォーク爆弾を発射する元のプロセスがSIGKILLから消滅しても、その数多くの子孫はそのシグナルを受信せず、したがって子供を産卵し続けてシステムを膝に近づけることです並行実行が許可されているプロセスの数に制限があります。試してみることはお勧めしません。おそらくリブートする必要があります。 (プロセスグループとセッションは関連します。) –

+0

私は爆弾をテストするためにバーチャルボックスを使用していますが、子プロセスがSIGKILLを受け取らないようにするにはどうすればいいですか? – Will

+1

適切に承認されたプロセス(例えば、 'root 'によって実行されるプロセス)からSIGKILLを受け取ることはできません。子プロセスがそのIDを作成したユーザーからIDを変更することができれば(SUIDは別のユーザーになるなど)、一種の免責が得られる可能性があります。しかし、 'root'がSIGKILLを送るプロセスを起動すると、プロセスは突然終了し、執行猶予のオプションはありません。唯一失敗するのは、プロセスが中断されないシステムコールに掛かっている場合です。これは、利用できないNFSファイルシステムでは時々起こることがありますが(以前はありましたが)... –

答えて

1

シグナルを避けることはできません/免疫sigkillシグナル。それはシグナルSIGKILLと言うとSIGSTOPはキャッチまたは

while(1){ 
     fork(); 
    } 

あなたが好きなだけプロセスを作成することはできませんので、それは良い考えではありませんを無視することはできませんsignal() のmanページを読みますいくつかの制限があります。チェックはulimitです。リソースが存在しない段階ですぐに失敗します(shはエラーメッセージを表示します)。

+2

これは厳密に答えの一部です。答えの非常に重要な部分ですが。 –

+0

フォークの爆弾をどうやって作るの?私はそれを読んでいます:(){:|:& };:これはもっと良い選択肢でしょうか? – Will

+0

@Will:シェルフラグメント ':(){:|:}}はシンプルなフォークボンベですが、あなたが示したCコードと大きな違いはありません。他の同様のコードと同様、SIGKILLと同様に脆弱です。そのコード(シェルの断片)が実際に何をするのか理解していますか? –

関連する問題