Bonjour
Voilà, souhaitant revisiter les concepts de communications entre processus via des signaux, j'ai écrit un petit programme qui crée un fils.
Ensuite, le père et le fils doivent écrire chacunleur tour un nombre qui s'incrémente indépendemment.
Le souci à l'exécution de ce programme est que je n'obtiens pas une alternance parfaite. En effet, le père exécute 4 fois de suite son évènement avant que le fils n'en exécute qu'un.
J'obtiens donc :
J'ai eu beau farfouillé, impossible de mettre le doigt sur mon erreur. Quelqu'un détecte-t-il la faille ? Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 JEU D ESSAI : pere n = 1 pere n = 2 pere n = 3 pere n = 4 fils n = 1 pere n = 5 ... pere n = 10
Merci d'avance
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 struct sigaction act_min, act_maj; pid_t pidFils, pidPere, pid; //affichage par le fils void handler_min(int x){ static int n = 1; printf("fils n = %d\n", n); //on incrémente le nombre de lettres à afficher la prochaine fois n++; kill(pidPere,SIGUSR1);//on appelle le pere } //affichage par le père void handler_maj(int x) { static int n = 1; printf("pere n = %d\n", n); //test condition de fin du programme if (n <= 10) { n++;//on incrémente le nombre de lettres à afficher la prochaine fois kill(pidFils,SIGUSR1);//on appelle le fils } else exit; } main(){ pid=fork(); if(pid==0) { /*processus fils*/ //enregistrement des PID du père et du fils pidFils = getpid(); pidPere = getppid(); act_min.sa_handler=handler_min;//on enclenche le signal sigaction(SIGUSR1,&act_min,NULL); while(1) { pause(); } }else{ /*processus pere*/ sleep(1);//pour que ce soit le fils qui commence act_maj.sa_handler=handler_maj;//on enclenche le signal sigaction(SIGUSR1,&act_maj,NULL); kill(pidFils, SIGUSR1);//on envoie le premier signal au fils while(1) { pause(); } } }
Partager