Вилка и зомби процесс - PullRequest
       19

Вилка и зомби процесс

1 голос
/ 15 августа 2011

Я пытаюсь простой код на форк.Когда я даю такой код, он работает нормально.Будет напечатано

Я - ребенок

Я - родитель

и затем ждет 30 секунд.Я понимаю, что это связано с переключением между этими двумя процессами.Сначала выполняется дочерний процесс, затем родительский, а затем дочерний ...

#include<stdio.h>
#include<stdlib.h>
main()
{
    int pid;
    pid=fork();
    if(pid==0)
    {
        printf("\nI am the child\n");
        sleep(30);
        exit(0);
    }
    if(pid>0)
    {
        printf("\nI am the parent\n");
        wait();
    }
}

Но когда я дал как (без ожидания в родительском)

#include<stdio.h>
#include<stdlib.h>
main()
{
    int pid;
    pid=fork();
    if(pid==0)
    {
        printf("\nI am the child\n");
        sleep(30);
        exit(0);
    }
    if(pid>0)
    {
        printf("\nI am the parent\n");

    }
}

он просто печатает

Я - ребенок

Я - родитель

и выходит (без ожидания в течение 30 секунд).

Так и есть, потому что без ожидания родительского вызова выходита ребенка все еще исполняешь?Но почему он не отображается в терминале (ожидании)?

Является ли родитель здесь зомби?

Ответы [ 4 ]

4 голосов
/ 15 августа 2011

Ваши наблюдения верны.

Терминал ожидает завершения исходных процессов (которые являются родительскими). Он не ждет завершения дочерних процессов.

Зомби: процесс является зомби, если он вышел, но его родитель не вызвал wait () для него.

В вашем случае родитель не становится зомби, потому что терминал его ждет.

2 голосов
/ 15 августа 2011
  1. Да.
  2. Дедушка никогда не ждет детей; дети без родителей переучиваются в init.
  3. Нет, он умирает.
0 голосов
/ 15 августа 2011

Во втором примере ребенок становится сиротой, потому что родитель вернулся, пока ребенок жив.Сиротский процесс принадлежит init, а не оболочке, поэтому он не отображается.В ваших двух примерах кода нет зомби.Зомби - это когда родитель жив, а ребенок мертв, и родитель не звонит, пока ребенок не станет зомби.

0 голосов
/ 15 августа 2011

Оболочка ожидает завершения родительского процесса, но не дочернего.

Дочерний становится зомби через 30 секунд (что оболочка очистит при следующем запросе).

...