4

シナリオ: 要求 (TCP-IP) によってデーモンを開始および停止するデーモン監視アプリケーションを開発しています。setsid()それを実現するために、フォークした後、親プロセス (監視プロセス) から新しいプロセスを「デタッチ」するために呼び出しています。

監視アプリケーションが作成したプロセスの 1 つを強制終了しようとすると、そのプロセスは機能しなくなります。

これが私のコードです:

int retval;
char* arg_list[] = {
  NULL      /* The argument list must end with a NULL.  */
};
retval = fork();
if (retval == 0)
{
    umask(0);
    setsid();
    execv(LBSDPATH, arg_list);
    exit(0);
}

私が理解しているように、機能していない/ゾンビプロセスは、親がまだプロセスに参加していないことを意味します。解決しませんsetsid()か?

4

1 に答える 1

3

親は、子プロセスを呼び出すwait()waitpid()、機能していない/ゾンビ状態から「解放」する必要があります。

SIGCHLDこれは、親のスレッドで行うことも、子の死亡時に受信したシグナルを処理する親のシグナル ハンドラで行うこともできます。


アップデート

Mellowcandle のinitコメントで述べられているように、子供をデイモンとして生きさせるために親を変更する必要があることを言及しています

ちょうどfork()2回。つまり、最初のfork()ed プロセスfork()が別のプロセスから離れただけです。

2 番目にfork()ed のプロセスに を実行exec*()させ、最初のfork()edプロセスを終了させます。

最初のfork()ed プロセスが終了すると、その子 (2 番目のfork()ed プロセスとその後継プロセス: exec*()'ed プロセス) が継承され、この子の /death をinit処理します。SIGCHLD

于 2013-05-27T11:48:22.840 に答える