Создание дочернего процесса в c с использованием fork - PullRequest
1 голос
/ 26 апреля 2019

Я нашел этот код в geeks4geeks, и я не могу понять его правильно:

#include<stdio.h> 


int main() 
{ 
    for(int i=0;i<5;i++) // loop will run n times (n=5) 
    {  pid_t c=fork();
        if(c == 0) 
        { 
            printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid()); 
            exit(0); 
        } 
    } 
    for(int i=0;i<5;i++) // loop will run n times (n=5) 
    wait(NULL); 

} 

Этот код создает 5 процессов из родительского процесса и печатает сообщение от каждого дочернего элемента. Мой вопрос таков: поскольку мы не использовали никаких ограничений для c, например, это не вторая ветвь, выполняемая и отцом, и первым дочерним элементом Процесс? Без изоляции fork внутри кода отца, как этот код не создает 2 ^ 5 дочерних процессов? Цикл for каким-то образом останавливает это?

Ответы [ 2 ]

5 голосов
/ 26 апреля 2019

Дочерние процессы не вызывают fork, потому что они завершают работу до того, как это произойдет:

for(int i=0;i<5;i++)
{   
    pid_t c=fork();
    if(c == 0)  // fork returns 0 to the child process so it enters "if" block
    { 
        printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid()); 
        // child exits
        exit(0); 
    } 
} 

Если блок if не содержит exit, тогда да, каждый дочерний элемент будет повторяться довершина цикла и потенциально fork снова.Но поскольку каждый дочерний элемент завершает работу сразу после печати, только начальные родительские процессы вызывают fork, поэтому вы создаете только 5 процессов.

2 голосов
/ 26 апреля 2019

fork() возвращает 0 в дочернем процессе, а в родительском процессе возвращает PID дочернего процесса.Поскольку c имеет значение 0 в дочернем элементе, if(c == 0) будет иметь значение true, дочерний элемент выполнит оператор printf и завершит работу.Он никогда не достигнет оператора оценки цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...