5

Linuxメッセージキューを使用して単純なタイムサーバーとクライアントを作成する必要がある場合に割り当てがあります。サーバーはメッセージキューを開き、クライアントは自分のPID(タイプ1のメッセージ)で要求を送信し、サーバーはそのメッセージを読み取り、タイプPID(読み取られたメッセージから取得)のメッセージを送信します。どこで間違いを犯したのかわからないので、以下にすべてのコードを入れました。私はLinuxプログラミングの専門家ではありません。私がサーバーを正しく書いたかどうかさえ知りません。

サーバーとクライアントに含まれているファイル(このように記述する必要があります)。

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

サーバ

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);
}

クライアント

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

どちらのプログラムもエラーなしでコンパイルされますが、クライアントは「キューからの読み取りエラー」を返します。msgrcvは-1を返します。

4

1 に答える 1

9

追加した後、 「 msgp(バッファ)が指すアドレスにアクセスできません」というperrorエラー"Bad Address"EFAULT )が表示されます。コードから、メモリが割り当てられていないように見えるので、メモリを割り当てるか、メモリをに変更して、の代わりに渡すことができます。また、サイズは(から、またはforへの変更を想定)ではなく(&明らかにそれに応じてステートメントを変更する)にする必要があり ます。これがお役に立てば幸いです。TimeMessage *tTimeMessage t&ttmsgrcvsizeof t*ttsizeof(TimeMessage)*tsizeof(struct tm)printf

于 2012-05-22T17:39:59.983 に答える