2010-04-13 2 views
0

J'essaie de comprendre la sortie d'un bloc de code C en utilisant fork() et j'ai quelques difficultés à comprendre pourquoi cela se passe ainsi. Je comprends que lors de l'utilisation de fork() il démarre une autre instance du programme en parallèle et que l'instance enfant retournera 0. Quelqu'un pourrait-il expliquer étape par étape la sortie du bloc de code ci-dessous? Je vous remercie. EDIT: J'ai oublié d'ajouter la sortie (1) après la boucle. MES EXCUSES.Aide avec la sortie générée par ce code C en utilisant fork()

main() { int status, i; 
     for (i=0; i<2; ++i){ 
      printf("At the top of pass %d\n", i); 
      if (fork() == 0){ 
       printf("this is a child, i=%d\n", i); 
      } else { 
       wait(&status); 
       printf("This is a parent, i=%d\n", i); 
       } 
      } 
      exit(1); 
} 
+1

... Et comment * ça sort? –

+0

Pourquoi ne pas nous dire le résultat et ce qui est confus à ce sujet. – Joe

+0

L'avez-vous exécuté? Puisque c'est un programme de test, je le ferais comme première étape. Quand vous regardez la sortie, vous pouvez facilement déduire ce qui s'est passé, n'est-ce pas? – MJB

Répondre

0

Ce code peut être difficile à expliquer. La raison en est que le premier enfant ne sort pas et va lui-même appeler une fourchette. Essayez de modifier le code pour inclure l'ID de processus sur chaque ligne d'impression tels que:

printf("At the top of pass %d in pid %u\n", i, getpid()); 

remarque alors comment l'enfant devient le parent ...

1

Qu'est-ce qui se passe sur la première boucle est que la première fourche de processus . Dans l'un, fork() renvoie 0 et dans l'autre il renvoie le pid du processus enfant. Ainsi, vous en obtiendrez un qui affichera "ceci est un enfant" et un qui affichera "c'est un parent". Ces deux processus continuent à travers la boucle, incrémenter i à 1 et fork() à nouveau. Maintenant, vous avez quatre processus: deux enfants et deux parents. Les quatre processus incrémenteront i à 2 et sortiront de la boucle.

Si vous avez augmenté la condition de terminaison de boucle à i<3, les quatre processus exécuteront la prochaine fois autour de la boucle fork() et vous auriez huit processus au total. S'il n'y avait pas de limite dans la boucle, vous auriez un fork bomb où vous créeriez de façon exponentielle de plus en plus de processus chaque boucle jusqu'à ce que le système manque de ressources.

+0

Hrm. Je pense que je compte respectivement 3 et 6. Peut-être que je dois exécuter le code moi-même ... –

+1

One minor nit. * Ces deux processus continuent à travers la boucle * n'est pas tout à fait correct, puisque le parent a ca attendre, seul l'enfant continue à travers la boucle; le parent de cette fourchette particulière ne continuera pas tant que l'enfant ne sera pas sorti. –

+0

Ah, 7 sur la deuxième manche. Mais je vois pourquoi. –

Questions connexes