web-dev-qa-db-ja.com

ゾンビの子プロセスを防ぐにはどうすればよいですか?

fork()を使用してクライアント接続のハンドラーを生成するサーバーを作成しています。サーバーは、フォークされたプロセスがどうなるかを知る必要はありません。プロセスは独自に機能し、完了したら、ゾンビになるのではなく、ただ死ぬ必要があります。これを達成する簡単な方法は何ですか?

13
thejh

いくつかの方法がありますが、 sigaction with SA_NOCLDWAIT親プロセスでは、おそらく最も簡単なプロセスです。

struct sigaction sigchld_action = {
  .sa_handler = SIG_DFL,
  .sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);
11
thejh

ダブルフォークを使用してください。子供にすぐに別のコピーをフォークしてもらい、元の子プロセスを終了させます。

http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html

私の意見では、これは信号を使用するよりも簡単で、より理解しやすいです。

void safe_fork()
{
  pid_t pid;
  if (!pid=fork()) {
    if (!fork()) {
      /* this is the child that keeps going */
      do_something(); /* or exec */
    } else {
      /* the first child process exits */
      exit(0);
    }
  } else {
    /* this is the original process */  
    /* wait for the first child to exit which it will immediately */
    waitpid(pid);
  }
}
5
xaxxon

ゾンビプロセスを取り除く方法は?

通常のプロセスを強制終了するときに、SIGKILLシグナルを使用してゾンビプロセスを強制終了することはできません。ゾンビプロセスはシグナルを受信できないためです。ですから、良い習慣を持つことは非常に重要です。

次に、プログラミング時に、ゾンビプロセスの量を取り除く方法は?上記の説明によると、子プロセスは、終了時にSIGCHLDシグナルを親プロセスに送信します。デフォルトでは、このシグナルはシステムによって無視されるため、シグナル処理関数でwait()を呼び出すことが最善の方法です。これにより、システム内でゾンビが立ち往生するのを防ぐことができます。これについてもっと見る: http://itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/

0
user3060336