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.

Suggestion: Lorsque vous travaillez avec des Api qui ensemble 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