Linux Fork: повторное использование pid


Я написал следующую программу, чтобы понять, как работает fork при вызове без wait () или waitpid ().

int main()
{
    pid_t childpid; 
    int retval = 0; 
    int i; 
    while(1){
        //usleep(1);
        childpid = fork();

        if (childpid >= 0) 
        {
            i++;
            if (childpid == 0) 
            {   
                exit(retval); 
            }
            else 
            {
                //printf("childpid is %dn", childpid);                     
            }
        }
        else
        {
            printf("total no. of processes created = %dn", i);
            perror("fork"); 
            exit(0); 
        }
    }
}

Вот результат, который я получаю->

total no. of processes created = 64901
fork: Cannot allocate memory

Я ожидал, что программа будет продолжаться, поскольку я немедленно выхожу из дочернего процесса, и fork () должен повторно использовать PID после pid > pid_max. Почему этого не происходит?

2 5

2 ответа:

Вышедшие дочерние процессы остаются в таблице процессов как зомби. Зомби-процессы существуют до тех пор, пока их родитель не вызовет wait или waitpid, чтобы получить их статус выхода. Кроме того, соответствующий идентификатор процесса сохраняется, чтобы предотвратить дублирование его другими вновь созданными процессами.

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

Разветвление процессов, а затем не получение их состояния выхода можно рассматривать как утечку ресурсов. Когда родитель выходит, они будут приняты процессом init и затем пожаты, но если родитель остается живым слишком долго, система не может просто удалить некоторых зомби, потому что предполагается, что родитель должен заинтересоваться ими в какой-то момент через wait или waitpid.

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

Эти дочерние процессы станут зомби.

Вы можете использовать "ps-aux" для сброса этих fd.