2014-05-13 211 views
0

在linux中,當消息隊列爲空時,消息隊列的輸出應該是什麼?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

您需要檢查的msgrcv返回值(你這樣做的話)和errno。從msgrcv文檔:

IPC_NOWAIT如果沒有請求類型的消息在隊列中,則立即返回。系統調用失敗,errno設置爲ENOMSG

如果您忽略失敗並嘗試讀取msg,則其值將不確定,因爲它未初始化。例如: -

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後,你想要什麼分號,這可能不是原碼)。

+0

我已附上我的輸出圖像 – user3571717

+0

@ user3571717您應該將它附加到您自己的問題,男人。 –

+0

最終我想知道爲什麼這個垃圾數值來自消息隊列中的所有消息後 – user3571717