web-dev-qa-db-ja.com

ゾンビプロセスを作成する

ゾンビプロセスの作成に興味があります。私の理解では、ゾンビプロセスは、子プロセスの前に親プロセスが終了したときに発生します。ただし、次のコードを使用してゾンビプロセスを再作成しようとしました。

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  if (child_pid > 0) {
    exit(0);
  }
  else {
    sleep(100);
    exit (0);
  }
  return 0;
}

ただし、このコードは実行直後に終了します。しかし、私がするように

ps aux | grep a.out

A.outは、予想どおりのゾンビプロセスではなく、通常のプロセスとして実行されていることがわかりました。

私が使用しているOSはubuntu14.0464ビットです

15
user3354832

引用:

私の理解では、ゾンビプロセスは、子プロセスの前に親プロセスが終了したときに発生します。

これは間違っています。 _man 2 wait_ によると(注を参照):

終了したが待たなかった子は「ゾンビ」になります。

したがって、ゾンビプロセスを作成する場合は、fork(2)の後、子プロセスはexit()であり、親プロセスは終了する前にsleep()である必要があります。 ps(1)の出力を観察する時間を与えます。

たとえば、次のコードを自分のコードの代わりに使用し、ps(1)sleep() ing中に使用できます。

_#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
    pid_t pid;
    int status;

    if ((pid = fork()) < 0) {
        perror("fork");
        exit(1);
    }

    /* Child */
    if (pid == 0)
        exit(0);

    /* Parent
     * Gives you time to observe the zombie using ps(1) ... */
    sleep(100);

    /* ... and after that, parent wait(2)s its child's
     * exit status, and prints a relevant message. */
    pid = wait(&status);
    if (WIFEXITED(status))
        fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
                (int) getpid(), pid, WEXITSTATUS(status));

    return 0;
}
_
18
chrk