代码中的错误:消息队列没有收到值

时间:2014-04-19 11:34:42

标签: c posix

我的队列正在发送消息,但它没有收到...

任何人都可以帮助解决问题。

编者注:改进了代码格式,但需要更多细节


代码:

#define MAXSIZE     128

void die(char *s)
{
  perror(s);
  exit(1);
}

struct msgbuf
{
    int    mtype;
    char    mtext[MAXSIZE];
};

- > main()的

main()
{
    int msqid;
    int msgflg = IPC_CREAT | 0666;
    key_t key;
    struct msgbuf sbuf;
     struct msgbuf rcvbuffer;
    int buflen;
    srand(time(0));
    key = rand()%(100+40);
    printf("%d",key);

获取给定密钥的消息队列ID

    if ((msqid = msgget(key, msgflg )) < 0)   //Get the message queue ID for the given key
      die("msgget");

    //Message Type
    sbuf.mtype = 1;

    printf("Enter a message to add to message queue : ");
    scanf("%[^\n]",sbuf.mtext);
    getchar();

    buflen = strlen(sbuf.mtext) + 1 ;

    if (msgsnd(msqid, &sbuf, buflen, IPC_NOWAIT) < 0)
    {
       printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buflen);
        die("msgsnd");
    }

    else
        printf("Message Sent\n");
    printf("%d",msqid);
    exit(0);


    if ((msqid = msgget(key, 0666)) < 0)
      die("msgget()");

收到消息类型1的答案。

     //Receive an answer of message type 1.
    if (msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0)
      die("msgrcv");

    printf("%s\n", rcvbuffer.mtext);
}

由于

1 个答案:

答案 0 :(得分:0)

我花了一些时间,但我发现了你的错误。消息队列的类型检查取决于long类型的mtype字段而不是int。

如果您只是在没有指定类型的情况下收到消息,它就会通过。但是如果指定类型,则不会,因为“struct msgbuf”中的“mtype”字段是int类型而不是long类型。 (在我的 - 很可能是你的 - 架构上,两者之间有4个字节的差异)

将struct msgbuf中的mtype类型更改为long,它将起作用...