1
votes

Création de n processus fils en c en utilisant fork

J'ai trouvé ce code dans geeks4geeks et je n'arrive pas à le comprendre correctement:

#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); 

} 

Ce code crée 5 processus à partir d'un processus père et imprime un message de chaque enfant.Ma question est la suivante: puisque nous n'avons utilisé aucune restriction pour c, le deuxième fork n'est-il pas par exemple exécuté par le père et le premier processus enfant? Isolation de la fourche dans le code du père Comment ce code ne crée-t-il pas 2 ^ 5 processus enfants? La boucle for empêche-t-elle cela de se produire?


3 commentaires

Vos enfants exit juste après avoir été créés, comment peuvent-ils exécuter fork ?


La chose clé à noter est que la valeur de retour pour fork() dans le processus enfant est 0 et dans le processus parent est le pid de l'enfant. Ainsi, dans le processus enfant, le test if est vrai, et l'instruction d'impression est exécutée et le processus se termine. Si le processus parent, le test if est faux et la boucle continue et fourche un autre processus enfant.


Ce n'est pas un «fils», c'est un «enfant». Ce n'est pas un «père», c'est un «parent». Les processus sont sans genre.


3 Réponses :


2
votes

fork() renvoie 0 dans le processus enfant, tandis que dans le processus parent, il renvoie le PID de l'enfant. Puisque le c a une valeur de 0 dans l'enfant, if(c == 0) évaluera à vrai, l'enfant exécutera l'instruction printf , puis quittera. Il n'atteindra jamais l'instruction d'évaluation de la boucle.


0 commentaires

6
votes

Les processus enfants n'appellent pas fork car ils se terminent avant que cela ne se produise:

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); 
    } 
} 

Si le bloc if ne contenait pas de exit alors yes, chaque enfant reviendrait en haut de la boucle et ferait potentiellement à nouveau un fork . Mais comme chaque enfant quitte juste après l'impression, seul le processus parent initial appelle fork , vous ne créez donc que 5 processus.


0 commentaires

0
votes

Dans ce programme, ils utilisent exit (0), de sorte que le processus enfant se termine après sa création.


0 commentaires