Bonjour,
Essayant de comprendre les sémaphores, je me suis lancé un défit : tenter d'avoir à l'affichage : A B A B A B A ... et ensuite tenter d'obtenir A B B A B B A ...
Seulement, je n'y arrive absolument pas. Voici les différents codes sources :
Normalement, ce programme crée deux sémaphores avec comme valeurs respectives : 1 et 0.
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 int nbsem = 1; int clef = 888; int id = semget(clef, nbsem, 0777 | IPC_CREAT); if(id == -1) { cout << "Erreur lors de la création des sémaphores" << endl; exit(1); } semun s; ushort * t = new ushort[nbsem]; t[0] = 1; t[1] = 0; s.array = t; int ret = semctl(id, nbsem, SETVAL, s);
Ensuite dans le programme A, j'effectue :
Le code B est le même en inversant les sem_num.
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 int clef = 88; int id = semget(clef, 2, 0666); // récupérer les deux sémaphores (2) if(id == -1) { cout << "Erreur lors de la lecture du sémaphore" << endl; exit(99); } struct sembuf bufferP; struct sembuf bufferV; while(true) { bufferP.sem_num = 0; bufferP.sem_op = -1; bufferP.sem_flg = 0; semop(id, &bufferP , 1); // Attachement de la sémaphore au processus int id, ret; // Arret du programme pendant une seconde. sleep(1); // Affichage du message. cout << "Programme A (pid : " << getpid() << ") : " << nb << "s" << endl; // V(B) bufferV.sem_num = 1; bufferV.sem_op = 1; bufferV.sem_flg = 0; semop(id, &bufferV, 1); } return 0;
Seulement je lance le code de cette façon : ./A && ./B et là j'obtiens A B A B A B et en effectuant l'inverse (après avoir réinitialisé les sémaphores), j'obtiens : ./B && ./A ... B A B A B A. Donc si vous voyez d'où vient l'erreur, je veux bien un correctif.
Et normalement, le programme B ne devrait pas être lançable …*Mais lorsque je fais ./B, il se lance …
Merci beaucoup !
Partager