0

Unixのメッセージキューがどのように機能するかを理解したいと思います。短いメッセージをキューに送信する簡単なコードを作成すると、そのメッセージを読み取ることができます。しかし、私のコードは次のことを示しています:

ここに画像の説明を入力してください

そして、その理由はわかりません-そして、キューに送信したメッセージを見ることができません。これが私のコードです:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

struct mymsgbuf {
    long mtype;
    char mtext[1024];
}msg;

int send_message(int qid, struct mymsgbuf *buffer )
{
    int result = -1, length = 0;
    length = sizeof(struct mymsgbuf) - sizeof(long);
    if((result = msgsnd(qid, buffer, length, 0)) == -1)
        return -1;
    return result;
}

int read_message(int qid, long type, struct mymsgbuf *buffer)
{
    int result, length;
    length = sizeof(struct mymsgbuf) - sizeof(long);
    if((result = msgrcv(qid, buffer, length, type,  0)) == -1)
        return -1;
    printf("Type: %ld Text: %s\n", buffer->mtype, buffer->mtext);
    return result;
}

int main(int argc, char **argv)
{
    int buffsize = 1024;

    int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL);
    if (qid == -1)
    {
        perror("msgget");
        exit(1);
    }

    msg.mtype = 1;
    strcpy(msg.mtext, "my simple msg");

    if((send_message(qid, &msg)) == -1)
    {
        perror("msgsnd");
        exit(1);
    }

    if((read_message(qid, 1, &msg) == -1))
    {
        perror("msgrcv");
        exit(1);
    }

    return 0;
}

この行のmsggetで行を変更したとき:

int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL | 0600);

それが示している:

ここに画像の説明を入力してください

4

1 に答える 1

1

のドキュメントからmsgget

msg_perm.modeの下位9ビットは、msgflgの下位9ビットと等しく設定されます。

少なくとも読み取りと書き込みでは、キューにいくつかのアクセス許可を追加する必要があります。次のようなことをします:

int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL | 0600);
于 2012-11-17T13:43:29.373 に答える