exécution de if / else if / else avec un fork ()

J’ai essayé de mettre en place un programme os. Voici le code:

#include #include #include int main() { pid_t pid, pid1; pid = fork(); if(pid<0) { fprintf(stderr,"Fork Failed"); return 1; } else if(pid == 0) /* child process */ { pid1 = getpid(); printf("child: pid = %d\n",pid); printf("child: pid1 = %d\n",pid1); } else /* parent process */ { pid1 = getpid(); printf("parent: pid = %d\n",pid); printf("parent: pid1 = %d\n",pid1); } return 0; } 

et son o / p:

 parent: pid = 1836 parent: pid1 = 1835 child: pid = 0 child: pid1 = 1836 

quelqu’un peut-il m’expliquer comment cela fonctionne, c’est-à-dire la séquence d’exécution pour les instructions if / else-if / else écrites dans le code. Je penserais else if condition else if devient vraie, alors la partie else n’est pas exécutée, mais ici, elle a exécuté la partie de processus parent, c’est-à-dire la partie else , puis la partie enfant … comment cela se fait-il?

Vous devriez lire sur fork () . Une fois que vous appuyez sur une instruction fork() , un second processus est démarré. Il contient une copie de tout ce que le processus parent possède, mais il peut exécuter une exécution distincte. Le retour affiché depuis le fork est différent de celui affiché par le parent.

  int main() { pid_t pid, pid1; <--- up to here you have one process running pid = fork(); <--- when this returns you have two processes: parent has pid = child's pid child has pid = 0 if(pid<0) <--- child and parent both check this, it's not true so they move on { .... } else if(pid == 0)<--- this is true for the child, not the parent { .... <--- child will now execute this code } else <-- nothing else was true for the parent so it sees this .... <-- and executes this code 

Donc, oui, vous avez raison, une fois que vous avez saisi le if , ou l' else if vous n'allez pas entrer dans une autre twig du code, lors de l'exécution d'un seul processus . Vous voyez les else if et les else parce que deux processus sont en cours d'exécution.

notez en quoi les pid1 sont différents, parce que getpid() renvoie quel processus exécute ce code, et vous pouvez voir que vous avez deux processus différents, l’un choisit l’ else if l’autre choisit l’ else .

fork () crée un nouveau processus dont l’exécution est indépendante du processus d’origine.

Votre nouveau processus enfant exécute l’élément else if .

Votre processus parent existant exécute la partie else .

L’ordre d’exécution entre votre processus enfant et votre processus parent n’est pas déterministe. Il s’agit désormais de processus différents et le système d’exploitation les planifie pour qu’ils s’exécutent comme le kernel le souhaite. Il peut être plus ou moins aléatoire que le processus parent ou enfant exécute son code en premier.

Vous pouvez même avoir les printfs de l’enfant et du parent entrelacés.

man fork

fork renvoie en réalité zero pour l’ID de processus enfant et non-zero pour le parent signifie que l’ID de processus réel de l’enfant est renvoyé au parent

after else if(pid ==0 ) {...} est un processus enfant

et else {...} est un processus parent.

La signification fondamentale de fork est de créer un nouveau processus.

Si main appelle one fork() seul l’enfant est créé avec son propre espace d’adressage. juste en dessous de l’appel fork, toutes les instructions sont identiques pour les processus parent et enfant.

la création d’un processus à l’aide de fork signifie que ces deux parent et child sont des processus indépendants et ne partagent aucune donnée entre eux par défaut

Mais dans votre cas, après l’appel fork, ces deux processus étant indépendants, l’ordre d’exécution de ces deux processus n’est pas spécifié. Vous pourriez obtenir ces choses:

 1. parent executed and program terminates parent: pid = 1235 parent: pid1 = 1234 2. child executed then parent and then program terminates : child : pid = 0 child :pid1 = 1235 parent : pid = 1235 parent :pid1 = 1234 

Si vous voulez vous assurer que cet enfant doit être exécuté en premier, puis que le parent doit quitter, mettre une ligne dans le code parent wait(NULL); comme la première déclaration dans else{..} Cela signifie que le parent attendra que l’enfant se termine.

Il existe deux processus différents qui exécutent votre programme. Après l’appel de fork , les instructions suivantes sont exécutées à deux resockets et ont des valeurs différentes de pid . Ainsi, les deux parties else if et else sont exécutées, chacune par l’un des deux processus.