linux中的消息队列

时间:2014-05-13 09:12:15

标签: linux message-queue garbage

在linux中,当消息队列为空时,消息队列的输出应该是什么?

首先,我在一个消息队列中发送了2条消息,然后我收到了来自消息队列的2条消息。现在我再次尝试从消息队列接收消息然后我得到垃圾值。然后告诉我为什么我得到这个垃圾值?

Receive.c

#include <stdio.h>
#include <sys/msg.h>
#include <error.h>
#include <strings.h>

int main() 
{
   int msqid;

   struct message 
   {
      long type;
      char text[20];
   } msg;

   struct msqid_ds buf;

   int msgtype = 3;
   int num_messages;
   int count;
   int key = 1234;

   msqid = msgget(key,0644);

   count = msgctl(msqid,IPC_STAT,&buf);
   num_messages = buf.msg_qnum;

   printf("Number of messages = %d\n",num_messages);

   if (msgrcv(msqid, (void *) &msg, sizeof(msg.text), msgtype, MSG_NOERROR| IPC_NOWAIT)==-1);
   {  
    perror("msgrcv");           
   }

   /*  if(num_messages==0)
       {
              printf("Queue is empty\n");
       }
       else
       {  */   
           printf("%s \n", msg.text);
    // }

       return 0;
 }

Send.c

#include <string.h>
#include <sys/msg.h> 
#include <stdio.h>
int main() 
{
    struct message 
    {
        long type;
        char text[20];
    } msg;

    int msqid;
    int key = 1234;
    msqid = msgget(key,IPC_CREAT|0644);

    msg.type = 3;
    strcpy(msg.text, "This is message 1");
    msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);
    strcpy(msg.text, "This is message 2");
    msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);

    printf("2 messages are succesfully send \n");
    return 0; 
}

1 个答案:

答案 0 :(得分:1)

您需要检查msgrcv(您已经这样做)和errno的返回值。来自msgrcv文档:

  

IPC_NOWAIT如果队列中没有所请求类型的消息,则立即返回。系统调用失败,errno设置为ENOMSG

如果忽略失败并尝试阅读msg,则其值将无法确定,因为它未初始化。 E.g:

if(msgrcv(msqid, &msg, sizeof(msg.text), msgtype, MSG_NOERROR | IPC_NOWAIT))
{
    if(ENOMSG == errno)
        fprintf(stderr, "No messages found\n");
    else
        perror("msgrcv");
}
else {
    // Successfully received a message into msg.
}

(请注意,在原始代码中,您在if之后有一个分号,这可能不是您想要的。)

相关问题