親プロセスが終了した後にプロセスが終了するのを防ぐ方法は?

親プロセスが終了した後にプロセスが終了するのを防ぐ方法は?

私はフォークボムで遊んでプロセスを繰り返し分岐すると、初期プロセスを終了するとツリー全体がクラッシュすることがわかりました。 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);
}

このコードの根拠について詳しくは、デーモンになることを読んでください。

おすすめ記事