在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;
}
答案 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
之后有一个分号,这可能不是您想要的。)