2013-09-05 64 views
1

我有一種情況,其中:SysV的消息隊列數增加

1:有一個讀取器進程和寫入過程,這些過程通過SysV的消息隊列通信。編寫器進程比讀取器進程快,也就是說,編寫器進程在隊列中寫入消息的速度比讀取器進程讀取消息並清空隊列的速度要快,例如,如果隊列中有8條消息(單個消息隊列)並且讀取器進程在當時編寫器進程嘗試寫入(msgsnd)隊列中的第9條消息時還沒有讀取一條消息。

3:會發生什麼情況,我的任何消息都會被覆蓋?

4:或者我隊列中的最後一條或第一條消息會被覆蓋?

5:或整個隊列會被覆蓋?

6:否則第9條消息將會丟失?

7:如何確保這些情況都不會發生,並且我不會丟失任何新的傳入消息,並且現有消息不會被覆蓋?

8:我該如何處理這種情況?

問候

回答

2

關於第3點,在manpage of msgsnd

When msgsnd() fails, errno will be set to one among the following values: 
... 
EAGAIN The message can't be sent due to the msg_qbytes limit for the queue 
and IPC_NOWAIT was specified in msgflg. 

因此,你將不能夠到另一個消息添加到隊列中,你需要將它們存儲在其他地方。如果您在打開隊列時指定了IPC_NOWAIT,則該消息將丟失。

+0

謝謝,但即使我使用寫入器進程將寫入的緩衝隊列,並且如果我將消息複製到消息隊列,仍然如何控制這三個進程的速度? – indranil

+1

如果您創建沒有IPC_NOWAIT標誌的隊列,則msgsnd將失敗(返回-1),並將errno設置爲EAGAIN。這會告訴你隊列已滿,並且除非至少提取一個,否則不能添加任何其他消息。 –

+0

感謝您的回覆 – indranil