bonjour à tous,

je suis un débutant en C et j'essaie de comprendre les IPC en ce moment.
Ma question concerne les files de message.
J'ai cru comprendre que le type d'un message c'est un peu comme un indice pour le retrouver dans la file.
J'ai donc implémenté ce code pour tester :

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdio.h>
 
#include <stdlib.h>
 
#include <string.h> 
 
#include <time.h>
 
#include <sys/msg.h>
 
#include <fcntl.h>
 
#include <unistd.h>
 
#include <sys/wait.h>
 
#include <netinet/in.h>
 
#include <libgen.h>
 
#include <sys/socket.h>
 
#include <sys/shm.h>
 
#include <sys/sem.h>
 
#include <errno.h>
 
#define CLE 12
#define BUFFSZ 1024
 
typedef struct{
 
    int type;
 
    char text[BUFFSZ];
 
} Message;
 
 
int main()
{
    Message* monMess = (Message*)malloc(sizeof(Message));
    Message* monMessRecu = (Message*)malloc(sizeof(Message));
    int msgid;
 
    if((msgid = msgget((key_t)CLE, IPC_CREAT|0666))==(-1))
 
    {
 
        fprintf(stderr,"erreur creation file de message");
 
        return 0;
 
    }
 
    monMess->type = 2;
    strcpy(monMess->text,"MessageUn");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    monMess->type = 3;
    strcpy(monMess->text,"MessageDeux");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    monMess->type = 4;
    strcpy(monMess->text,"MessageQuatre");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    monMess->type = 5;
    strcpy(monMess->text,"MessageTrois");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    monMess->type = 3;
    strcpy(monMess->text,"MessageSix");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    monMess->type = 4;
    strcpy(monMess->text,"MessageCinq");
 
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {
 
        perror("Envoi de msg raté!");
 
        return 0;
 
    }
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 0, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 0, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 5, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 4, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 4, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    msgrcv(msgid, monMessRecu, BUFFSZ, 3, 0);
 
    printf("%s \n",monMessRecu->text);
 
    sleep(2);
 
    return 0;
}
(j'ai mis des sleeps pour avoir bien le temps de reflechir mdr)
Cependant, à l'execution, il ne m'affiche que deux lignes (les deux premieres).
Je m'explique pour être vraiment précis dans mes propos.
Je compile avec : gcc main.c -o play
Ensuite j'execute : ./play
il m'affiche :
messageUn
messageDeux
puis si je relance : ./play
il m'affiche :
messageQuatre
messageTrois
puis je relance une derniere fois et il m'affiche :
messageSix
messageTrois
Je sais qu'il ne me réaffiche pas messageUn et messageDeux parce que je ne détruit pas l'ipc avec ipcrm mais ma question est : pourquoi ne m'affiche t-il pas :
messageUn
messageDeux
messageTrois
messageQuatre
messageCinq
messageSix
???


merci d'avance pour votre aide

edit : je viens de m'apercevoir qu'il ne marche qu'avec le nombre 0 pour les msgrcv. Donc que faut-il faire pour acceder a un message grace à son type ? Ma méthode n'est pas la bonne ? Merci encore d'avance