Disussions liées au livre Systèmes d'exploitation paru chez Pearson Education France.
Vous n'êtes pas identifié.
Suite à des abus constatés et provoqués par des connexions de "robots", l'enregistrement de nouveaux utilisateurs est temporairement suspendu. Merci de contacter l'administrateur du site pour s'abonner au forum.
Bonjour à vous.
J'ai quelque difficulté à comprendre comment le premier fils peut afficher '2', puisque printf("2") se trouve être dans les accolades conditionnelles du deuxième fils.
Même constat pour le père et le premier fils. Comment le père peut-il afficher '3'?
En tout cas cela ne me semble pas possible. Aurais-je tort? Et si oui, pourquoi?
Merci d'avance!
Hors ligne
Bonjour,
La correction p. 51 du livre est exacte. Vous confondez les pères et les fils dans votre raisonnement. Sachez que fork() retourne zéro lorsqu'il s'agit d'un fils. Le code source de l'exercice donne bien l'enchaînement suivant :
if(fork()==0) { /* on est dans le premier fils */
if(fork() == 0) { /* on est dans le second fils */
printf("1");
} else { /* on n'est pas dans le second fils ... on est donc dans le premier */
printf("2");
} else { /* on n'est pas dans le premier fils ... on est donc dans le père */
printf("3");
}
Rappelez-vous : fork() retourne 0 pour les fils et retourne le pid du fils pour le père.
Hors ligne
J'ai bel et bien compris comment fonctionne le fork(), mais je vous remercie de me l'avoir confirmé!
Après relecture sur le livre, il semble qu'il y ai bel et bien un problème avec les accolade.
Ce que je lis juste sous mes yeux, c'est exactement ceci :
if(fork()==0) { /*dans le premier fils */
if(fork() == 0) { /*entree dans le second fils */
if ((pid = wait(&status)) != 0) {
printf("1");
} /*fermeture de la condition pid=wait(&status) et toujours dans le second fils */
else {
if ((pid = wait(&status)) > 0) {
printf("2");/*toujours dans le second fils */
}
} /* fermeture du else et encore et toujours dans le second fils */
} /*fermeture du second fils */
Le second fils ne se ferme donc absolument pas avant le else censé faire printf("2")
Il en va de même avec le else pour le père puisque, comme vous pourrez le constater, le premier fils n'est pas fermé dans le code et le else de printf("3") vient juste après.
Mais n'ayant pas compris comment le &statut fonctionne exactement (c'est à dire, où sa valeur est-elle définie dans le code?), je me demande si les ((pid = wait(&status)) != 0) n'auraient pas un rôle à jouer. Si ce n'est pas le cas, je ne comprends pas comment le premier fils arrive à lire printf("2"), puisque ce dernier et dans la condition du second fils!
Dernière modification par nordmanb (13-08-2008 09:51:03)
Hors ligne