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 : 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);
Normalement, ce programme crée deux sémaphores avec comme valeurs respectives : 1 et 0.

Ensuite dans le programme A, j'effectue :

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;
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 !