1

我有一个场景:

1:有reader进程和writer进程,这些进程通过SysV消息队列进行通信。

2:Writer进程比Reader进程快,即Writer进程在队列中写入消息比Reader进程读取消息并清空队列快,例如如果我在队列中有8条消息(单个消息队列)和Reader进程当时尚未读取一条消息,写入程序进程试图写入(msgsnd)队列中的第 9 条消息。

3:我的任何消息都会被覆盖会怎样?

4:或者我在队列中的最后一条或第一条消息会被覆盖?

5:还是整个队列都会被覆盖?

6:否则第 9 条消息会丢失?

7:我怎样才能确保这些情况都不会发生,我不会丢失任何新的传入消息并且不会覆盖现有的消息?

8:我该如何处理这种情况?

问候

4

1 回答 1

2

关于第 3 点,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,则消息将丢失。

于 2013-09-05T11:58:04.800 回答