【问题标题】:Why I dont see a msg from message queue?为什么我没有看到来自消息队列的消息?
【发布时间】:2012-11-06 00:40:47
【问题描述】:

我想了解 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);

它显示:

【问题讨论】:

    标签: c unix queue message-queue


    【解决方案1】:

    来自msgget 的文档:

    msg_perm.mode 的低 9 位应设置为等于 msgflg 的低 9 位。

    您需要为队列添加一些权限,至少是读写权限。执行以下操作:

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

    【讨论】:

    • 确保在重新运行应用之前删除现有队列(ipcs -q 列出,ipcrm -q &lt;queue id&gt; 清理)
    • 不幸的是,同样的结果 :( - msgget: Permission denied
    • 您使用的是什么操作系统?确保删除该队列。如果您曾经以其他用户(尤其是 root)身份运行该代码,您可能没有删除正确的队列。
    • 我使用的是 Kubuntu 12.04 LTS。我从来没有以 root 身份运行此代码,就像我自己一样。当我删除队列时(没有队列,我确定,检查过)再次运行我的代码,收到消息 msgget: Permission denided 很奇怪,这应该可以工作,嗯?
    • 是的,适用于我在 Linux 上。尝试更改第一个 ftok 参数(例如更改为 /tmp)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2021-08-28
    • 2014-11-12
    • 2011-12-09
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多