Le but de l'exo est que le père cree deux fils et se mette en attente de la fin des fils.

Les fils eux :
- s'endorment une durée aléatoire.
- se terminent

Quand les 2 fils sont terminés, le père affiche la durée d'exécution.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/***************************************************************************
 *   Ennoncé de l'exercice :                                               *
 *      Un père créé deux processus fils et attend leur fin.               *
 *      Chaqu'un de ces deux fils s'endort une durée aléatoire             *
 *      puis se termine.                                                   *
 *                                                                         *
 *      Lorsque les deux fils ont terminé, le père affiche la durée        *
 *      d'exécution totale                                                 *
 *                                                                         *
 ***************************************************************************/
 
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
 
int alea(int n);
 
int main(void)
{
 
  time_t heureDebut, heureFin;
  pid_t pidFils1, pidFils2;
  int pid_retour,status;
  int attenteFils1,attenteFils2;
 
  srand((int)time(NULL));
  attenteFils1=alea(30);
  attenteFils2=alea(30);
  time(&heureDebut);
  printf("la date et l'heure de debut sont : %s\n", ctime(&heureDebut));
  printf("Lancement du fils 1\n");
 
/* Le père fork une 1ère fois */
 
  switch (pidFils1=fork())
  {
     case -1 :
        perror("erreur fork ");
        exit(1);
        break;
 
     case 0 :
        printf ("Je suis le processus fils 1 mon pid est %d je vais attendre %d secondes\n",getpid(),attenteFils1);
        sleep(attenteFils1);
        printf ("\n***************Fin du fils 1 ***************************************************");
        exit(0);
 
     default :
        printf ("Je suis le pere mon pid est %d \n",getpid());
  }
 
/* Le père fork une 2ème fois */
 
  printf("Lancement du fils 2\n");
  switch(pidFils2=fork())
  {
     case -1 :
        perror("erreur fork ");
        exit(1);
        break;
 
     case 0 :
       printf ("Je suis le processus fils 2 mon pid est %d je vais attendre %d secondes\n",getpid(),attenteFils2);
       sleep(attenteFils2);
       printf ("\n***************Fin du fils 2 ***************************************************");
       exit(0);
 
     default :
       /* On attend le fils qui termine en premier par un wait on récupère son pid */
       pid_retour=wait(&status);
       printf("Fin du wait numero 1 valeur de retour %d \n",pid_retour);
       perror("Pb lors du retour ");
 
       /* On attend le 2ème fils, on ne peut pas faire à nouveau un wait, on utilise donc un waitpid en lui donnant
          en 1er argument le pid du fils qui n'est pas terminé */
 
       if (pid_retour==pidFils1) {
	  pid_retour=waitpid(pidFils2,&status,0);
	  printf("Fin du wait numero 2 valeur de retour %d \n",pid_retour);
	  perror("Pb lors du retour ");
       }
 
       else {
          pid_retour=waitpid(pidFils1,&status,0);
	  printf("Fin du wait numero 2 valeur de retour %d \n",pid_retour);
	  perror("Pb lors du retour ");
       }
 
     /* Affichage du temps écoulé depuis le début pour faire joli !!! */
     time (&heureFin);
     printf ("\nMes fils ont terminés il est : %s%d secondes se sont ecoulees depuis le debut\n",ctime(&heureFin),(heureFin-heureDebut));
     exit(0);
  }
 
  return EXIT_SUCCESS;
}
 
int alea(int n)
{
   int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
   int maxUsefull = partSize * n + (partSize-1);
   int draw;
 
   do
   {
      draw = rand();
   } while (draw > maxUsefull);
   return draw/partSize;
}
Le programme fonctionne sauf que lors du retour du waitpid une erreur est détectée : illegal seek.

Je vous met la sortie du programme :

la date et l'heure de debut sont : Sun Dec 23 15:31:20 2007

Lancement du fils 1
Je suis le processus fils 1 mon pid est 5297 je vais attendre 7 secondes
Je suis le pere mon pid est 5296
Lancement du fils 2
Je suis le processus fils 2 mon pid est 5298 je vais attendre 21 secondes

***************Fin du fils 1 ***************************************************
Fin du wait numero 1 valeur de retour 5297
Pb lors du retour : Success

***************Fin du fils 2 ***************************************************
Fin du wait numero 2 valeur de retour 5298
Pb lors du retour : Illegal seek

Mes fils ont terminés il est : Sun Dec 23 15:31:41 2007
21 secondes se sont ecoulees depuis le debut
Appuyez sur la touche « Entrée » pour continuer !


Je ne comprends d'ou vient cette erreur.

Merci par avance!