私はフォークボムで遊んでプロセスを繰り返し分岐すると、初期プロセスを終了するとツリー全体がクラッシュすることがわかりました。 BASHのバックグラウンド演算子&を使用して書かれたフォーク爆弾の場合には該当しないので、この問題を解決する方法があることがわかります。 Cでどのように同じ結果を得ることができますか?
私はウィキペディアのフォークボムの例を使ってきました:http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs
答え1
setsid(2)
Cでこれを行う場合は、コードでaといくつかの呼び出しをfork()
実行する必要がありますexit()
。 setsid()
次の効果があります。
...呼び出しプロセスがプロセスグループリーダーでない場合は、新しいセッションを作成します。呼び出しプロセスは新しいセッションリーダーであり、新しいプロセスグループのプロセスグループリーダーであり、制御ttyはありません。
これはマニュアルページからのものです。デフォルトでは、プロセスグループのリーダーであるプロセスがシグナルを受信すると、そのプロセスグループのすべてのプロセスIDはそのシグナルを受け取ります。マニュアルページでこのメカニズムを見ることができますkill(2)
。負のPIDで呼び出されると、kill()
プロセスグループ内のすべてのプロセスに信号が送信されます。
fork()
exit()
また、正しい場所にいる必要があります。基本的に見てくださいデーモンになる方法のガイドライン。あなたがしなければならないこと:
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
setsid();
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
このコードの根拠について詳しくは、デーモンになることを読んでください。
答え2
プロセスをバックグラウンドに設定し、実行を継続する方法は2つあります。コマンドの開始後にバックグラウンドで実行されている場合は、&
このコマンドを使用して端末から切断できます。
$ disown -a
ハング信号(HUP)からプロセスを分離し、端末(tty)から切断するには、次のコマンドを使用することもできます。
$ nohup <cmd>
すべてのコンソール出力はファイルに書き込まれますnohup.out
。
したがって、disown -a
コマンドを使用してプロセスをバックグラウンドに配置した後、賢明な作業を実行することをお勧めします。
他のアイデアが必要な場合は、次のU&L質問に対する回答をご覧ください。フォーク爆弾のフォーク()はどこにありますか:(){ :|: & };:?。
氏
私はSOで次のタイトルのこの記事を見てみましょう。C: Exec/fork > 失敗したプロセス、具体的に答えは@ギルス。