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

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

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

関連情報