Подтвердить что ты не робот

Создание процесса зомби

Я заинтересован в создании процесса зомби. Насколько я понимаю, процесс зомби происходит, когда родительский процесс выходит из процесса перед детьми. Однако я попытался воссоздать процесс зомби, используя следующий код:

#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 ubuntu 14.04 64 бит

4b9b3361

Ответ 1

Цитирование:

Насколько я понимаю, процесс зомби происходит, когда родительский процесс выходит из процесса перед дочерними процессами.

Это неправильно. Согласно 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;
}