Initiation aux sémaphores
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 :
Code:
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); |
Normalement, ce programme crée deux sémaphores avec comme valeurs respectives : 1 et 0.
Ensuite dans le programme A, j'effectue :
Code:
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; |
Le code B est le même en inversant les sem_num.
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 !