Erreur “Mauvaise adresse” lors de la lecture d'un message de la file d'attente sur Linux
J'ai affectation quand j'ai besoin d'écrire simple serveur de temps et d'un client à l'aide de Linux file d'attente de messages. Le serveur ouvre un message de la file d'attente et le client envoie une requête 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). J'ai mis tout le code ci-dessous parce que je ne sais pas où j'ai fait l'erreur. Je ne suis pas Linux programmation expert. Ne sais même pas si je l'ai écrite serveur correct.
Fichier qui est inclus par le serveur et le client (j'ai besoin de l'écrire de cette façon).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <string.h>
#include <signal.h>
#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;
}
Programme compile sans erreur mais le rendement client "Erreur lors de la lecture de la file d'attente" msgrcv retourne -1.
errno
(comme le message de la file d'attente des Api dans votre cas), il pourrait être une bonne idée d'utiliser perror
ou strerror
merci @l'autre.anon.lâche, je me demandais pourquoi les exemples utilise perror
Maintenant msgrcv retour "Mauvaise adresse"
Que signifie "L'adresse pointée par msgp (tampon) n'est pas accessible.", il semble que vous n'avez pas à allouer la mémoire pour
t
, que diriez-vous d'essayer de changer TimeMessage *t
à TimeMessage t
& pass &t
au lieu de t
?Aussi la taille de votre passage dans
msgrcv
semble être incorrect, changer sizeof(struct tm)
à sizeof t
(en supposant que vous avez changé *t
à t
)
OriginalL'auteur jcubic | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
Après l'ajout de la
perror
il semble que vous avez le message d'erreur indiquant"Bad Address"
(EFAULT), ce qui signifie que "L'adresse pointée par msgp (tampon) n'est pas accessible". Dans le code, il semble qu'il n'y a pas eu de mémoire allouée àTimeMessage *t
de sorte que vous pouvez allouer de la mémoire ou de passer à laTimeMessage t
et passer&t
au lieu det
àmsgrcv
. Aussi de la taille devrait êtresizeof t
(en supposant que le changement de*t
àt
, ousizeof(TimeMessage)
pour*t
) au lieu desizeof(struct tm)
(& évidemment, vous pouvez modifierprintf
déclaration en conséquence)Espérons que cette aide!
t = malloc(sizeof(TimeMessage));
et de travail.OriginalL'auteur another.anon.coward