2012-05-18 17 views
1

我想要消耗的隊列上有多條消息(它們是整數),我想跟蹤我使用整數int consumed來消費多少消息。msgrcv後的整數被設置爲隨機值

我首先檢測隊列是否有消息使用ds.msg_qnum > 0其中ds是struct msqid_ds的對象。如果有消息,則我調用msgrcv來消費該消息並增加消耗的計數器。

所以我有這樣的:

msgrcv(msgqid, (void *) &message, sizeof(message), 1, 0) 
printf("consumed before incr: %d\n", consumed); 
consumed++; 

和消費表現爲每條消息後食用相同的隨機整數值。此外,我設置我的消息結構來保存消息數據類型爲int;我不確定那是否是吸菸槍。

+0

如何'message'聲明和初始化? – Mat

+0

聲明:'typedef struct msgbuf {long mtype; int mdata; } message_buf;' 初始化:'message_buf message;' – rcell

回答

2

您致電msgrcv無效。尺寸參數錯誤:

struct mymsg { 
    long mtype;  /* Message type. */ 
    char mtext[1]; /* Message text. */ 
} 

[...] 的參數msgsz指定多行文字字節大小。

您應該通過msgbuf.mdata的大小,而不是整個結構的大小。這可能會很好地覆蓋message的末尾,並且不管在那裏發生了什麼。

(請確保在調用msgrcv太前初始化message.mtype。)

+0

從手冊頁添加到此:msgsz參數指定mtext的大小(以字節爲單位)。 – mawia

+0

謝謝,我只是將傳遞的大小更改爲'msgbuf.mdata',並且它可以正常工作。我相信我只是在聲明long類型並且數據類型是任意的時候纔會讀取消息結構是有效的。我仍然不確定爲什麼數據會改變我的整數,因爲我的'msgsnd'也發送了整個結構的大小。你能澄清這一點嗎? – rcell

+1

'msgsnd' **必須**也只傳遞有效負載的大小,而不是整個結構。你發送的數據超過發送端的'int'末尾(未定義的行爲),並告訴msgrcv你在接收者的'mtext'中有很多空間,當你沒有(未定義的行爲) - 所以無論垃圾是在你的發送者的結構被轉移到你的接收器之後,並且在記憶中的'消息'之後被覆蓋,這恰好是你的計數器。對此非常小心 - 這種類型的錯誤可能非常難以調試。 – Mat