Systèmes d'exploitation

Disussions liées au livre Systèmes d'exploitation paru chez Pearson Education France.

Vous n'êtes pas identifié.

Annonce

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.


#1 12-08-2008 18:07:55

nordmanb
New member
Date d'inscription: 12-08-2008
Messages: 6

Exercice 6 [Problème de conditions et des sorties]

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

 

#2 12-08-2008 23:24:43

BartLamiroy
Auteur
Lieu: Nancy
Date d'inscription: 04-12-2006
Messages: 24
Site web

Re: Exercice 6 [Problème de conditions et des sorties]

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

 

#3 13-08-2008 09:49:06

nordmanb
New member
Date d'inscription: 12-08-2008
Messages: 6

Re: Exercice 6 [Problème de conditions et des sorties]

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

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson