Erreur “Mauvaise adresse” lors de la lecture de la queue de messages sous Linux

J’ai un devoir quand j’ai besoin d’écrire un serveur de temps simple et un client utilisant la queue de messages Linux. Le serveur ouvre une queue de messages et le client envoie une demande avec son PID (message de type 1) et le serveur lit ce message et envoie un message avec le type de PID (extrait du message lu). Je mets tout le code ci-dessous car je ne sais pas où j’ai commis l’erreur. Je ne suis pas expert en programmation Linux. Je ne sais même pas si j’ai écrit le serveur correctement.

Fichier inclus par le serveur et le client (je dois l’écrire de cette manière).

#include  #include  #include  #include  #include  #include  #include  #include  #define QUEUE 100 #define PERM_ALL 0777 typedef struct my_msgbuf { long mtype; int pid; } ClientMessage; typedef struct my_msgbuf2 { long mtype; struct tm time; } TimeMessage; 

Serveur

 int m_queue; void cleanup(int signum) { if (msgctl(m_queue, IPC_RMID, NULL) == -1) { printf("Something happen on clean up\n"); exit(1); } exit(signum); } int main() { ClientMessage pid_message; TimeMessage t; time_t clock; struct tm *cur_time; if ((m_queue = msgget(QUEUE, PERM_ALL | IPC_CREAT)) == -1) { printf("Can't create and open message queue\n"); exit(1); } printf("created message queue = %d\n", m_queue); fflush(stdout); //t = malloc(sizeof(TimeMessage)); signal(SIGINT, cleanup); while (1) { if (msgrcv(m_queue, &pid_message, sizeof(pid_message.pid), 1, 0) == -1) { break; } else { t.mtype = pid_message.pid; clock = time(NULL); cur_time = localtime(&clock); memcpy(&t.time, cur_time, sizeof(struct tm)); msgsnd(m_queue, &t, sizeof(struct tm), 0); } } cleanup(0); } 

Client

 int main() { int m_queue; TimeMessage *t; ClientMessage client; if ((m_queue = msgget(QUEUE, PERM_ALL)) == -1) { perror("Error in opening queue"); exit(1); } client.mtype = 1; client.pid = getpid(); while (1) { if (msgsnd(m_queue, &client, sizeof(client.pid), 0) == -1) { perror("Error sending to queue"); exit(1); } else { if (msgrcv(m_queue, t, sizeof(struct tm), client.pid, 0) == -1) { perror("Error reading from queue"); exit(1); } printf("time: %d:%d:%d\n", t->time.tm_hour, t->time.tm_min, t->time.tm_sec); } } return 0; } 

Les deux programmes comstacknt sans erreur mais le client retourne “Erreur lors de la lecture de la file” msgrcv renvoie -1.

Après avoir ajouté le perror il apparaît que vous avez l’erreur "Bad Address" ( EFAULT ), ce qui signifie que “L’adresse indiquée par msgp (buffer) n’est pas accessible”. À partir du code, il semble qu’il n’y ait pas eu de mémoire allouée à TimeMessage *t , vous pouvez donc soit allouer de la mémoire, soit simplement la changer en TimeMessage t et passer &t au lieu de t à msgrcv . La taille devrait aussi être sizeof t (en supposant le changement de *t en t , ou sizeof(TimeMessage) pour *t ) au lieu de sizeof(struct tm) (& évidemment vous modifieriez l’instruction printf conséquence)
J’espère que cela t’aides!