Bonjour,
J'ai voulu tester deux trois petites choses, d'où le petit code qui va suivre.
Or, je ne comprends pas ce qui se passe à l'exécution.
À l'affichage, j'obtiens :
Début du programme test.
Moto: J'attends le départ.
Puis, 10 secondes plus tard, le programme se bloque.
Dans mon idée, les deux processus devraient attendre le signal après leur création, cf la pause. Or, il semblerait que seul moto ait l'UC. Et plus bizarre encore, lorsque sigalarm est reçu, le programme se bloque…
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 int START_MOTO=0; int START_VOITURE=0; void motoGo(){ START_MOTO=1; } void moto(){ if(START_MOTO==0){ printf("Moto: J'attends le départ\n"); pause(); } printf("Vroum la moto démarre\n"); } void voitureGo(){ START_VOITURE=1; } void voiture(){ if(START_VOITURE==0){ printf("Voiture: J'attends le départ\n"); pause(); } printf("Zut j'ai plus d'essence !!!\n"); } int main(){ pid_t pid[2]; int k=0; printf("Début du programme test\n"); switch(pid[0]=fork()){ case -1: perror("Erreur fork"); exit(1); case 0: moto(); break; } switch(pid[1]=fork()){ case -1: perror("Erreur fork"); exit(1); case 0: voiture(); break; } signal(SIGUSR1,voitureGo); signal(SIGALRM,motoGo); kill(pid[1],SIGUSR1); alarm(10); for(k=0;k<2;k++){ wait(NULL); } printf("Fin du programme test\n"); return 0; }
Pourriez-vous me dire ce qui provoque ces erreurs ?
EDIT: J'ai compris une première erreur; wait peut être interrompu à la fois par un process fils se terminant mais aussi par un signal. Donc boucler deux fois n'est pas suffisant.
Ici je peux prévoir le nombre de signal qui sera envoyé, donc ce n'est pas grave, mais dans le cas ou l'on ne peut pas prévoir ce nombre, comment pourrait on faire pour attendre la terminaison de tous les fils ?
Ceci étant dit, ça ne m'explique pas pourquoi le programme se bloque...
Partager