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;
} |
Partager