2 votes

Exercice en C - fourches

J'essaie de comprendre comment le fork() fonctionne en C. Voici un exemple de problème tiré de mon manuel :

int
main(void)
{
  pid_t process_id;
  int status;

  if (fork() == 0) { 
    if (fork() == 0) { 
      printf("A"); 
    } else {
      process_id = wait(&status);
      printf("B");
    }
  } else {
    if (fork() == 0) { 
      printf("C");
      exit(0);
    }
    printf("D");
  }
  printf("0");
  return (0);
}

Parmi les sorties suivantes, lesquelles sont possibles ?

1) D0A0B0C

2) CDAB000

3) DA00CB0

4) D0AB0CD

5) AD00BC0

Je l'ai dessiné sur papier et je pense que la bonne réponse est : 1, 3, 5. J'ai eu quelques difficultés à contourner le wait(&status) Cependant, il ne s'agit pas d'une simple question d'argent, mais bien d'une question de sécurité. Ma réponse est-elle correcte ?

4voto

avlouis Points 166

Je viens de faire le calcul et je pense que les points 1, 3 et 5 sont corrects.

Il y a 4 processus, mais 2 ont une relation de dépendance à cause de l'attente. Les sorties possibles sont donc (_ signifie que la préemption est possible) :

_A_0_B_0_
_C_
_D_0_

2 et 4 ne fonctionnent pas car il n'y a pas de 0 entre A et B. Le wait est appelé dans un processus où fork()!=0, ce qui signifie qu'il s'agit d'un parent. La sémantique de fork() est que le parent reçoit l'identifiant du processus de l'enfant comme valeur de retour et l'enfant reçoit une valeur de retour de 0. Il devrait être assez facile de voir que 1, 3 et 5 fonctionnent si vous suivez les 3 sorties ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X