2017-09-20 1 views
0

donc je vais tenter de résoudre un problème dans mon livre concernant l'appel système fork en C.programme fork() en C

Voici le code suivant:

#include <stdio.h> 
#include <unistd.h> 

int main() { 

int i = 1; 

    if (fork()) //parent process will return PID of child. 
     i++; 
    else if (fork()) //child process (becomes parent) 
      i--; 
     else //grandchild process returns 0 
      i++; 

printf("%d\n", i); 
} 

Après avoir traversé le code , J'ai 2 0 2 comme solution. Je suis confus cependant puisque je ne sais pas quel ordre est correct? Les processus enfants peuvent-ils être imprimés avant que le parent ne le fasse? Si oui, une autre solution viable pourrait être 0 2 2 ou 2 2 0. Comment savoir si toutes les instructions conditionnelles seront exécutées? Je sais que dans le premier conditionnel, l'instruction if sera exécutée et sera le processus parent (qui retournera l'identifiant de processus de l'enfant, et la valeur de i sera incrémentée à 2). Comment saurais-je si le code else if et else sera exécuté? Désolé, je suis juste confus et j'essaie de m'en sortir parce que c'est un nouveau sujet pour moi.

Toute aide serait grandement appréciée. Merci d'avance.

+0

Je suggère d'ajouter des commentaires au code pour préserver votre compréhension. Par exemple, dans le premier bloc 'if (fork())', vous pouvez ajouter un commentaire "la première fourchette renvoyée non nulle, c'est le parent". Et continuez tout au long du programme. –

+0

Fait les modifications, toujours à la recherche d'une aide plus détaillée, merci. – Derek

+0

Ce code a été posé à propos de, vraisemblablement par quelqu'un d'autre, au cours des deux dernières semaines. –

Répondre

2

Le processus enfant peut être imprimé avant la fin du parent. Rappelez-vous, dans le processus parent, l'appel à fork() renvoie un nombre différent de zéro, alors que chez l'enfant, il retourne 0.

#include <stdio.h> 
#include <unistd.h> 

int main() { 

int i = 1; 

    if (fork()) 
     i++; 
    else if (fork()) 
      i--; 
     else 
      i++; 

printf("%d\n", i); 
} 

Pour le code ci-dessus, le parent exécutera la première instruction if(), l'enfant exécutera l'instruction else if et le petit-enfant exécutera l'instruction else. L'enfant/petit-enfant/parent peut être imprimé dans n'importe quel ordre. Donc, 2 0 2, 2 2 0 et 0 2 2 sont toutes des solutions viables.

+0

Salut @JohnDoe merci pour votre réponse. Donc, dans l'instruction 'else if', est-ce que ce processus est le processus fils ou parent? – Derek

+0

@Derek: c'est l'enfant du processus initial et le parent du processus final. –

+0

Merci pour votre réponse. Aussi, je veux juste confirmer comment nous savons que toutes les déclarations conditionnelles seront exécutées? – Derek