【问题标题】:SysV message queue number increaseSysV 消息队列数量增加
【发布时间】:2013-09-09 04:23:43
【问题描述】:

我有一个场景:

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

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

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

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

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

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

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

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

问候

【问题讨论】:

    标签: linux multithreading process message-queue sysv


    【解决方案1】:

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

    【讨论】:

    • 谢谢,但是即使我使用写入器进程将写入的缓冲区队列,如果我将消息复制到消息队列中,我仍然从该缓冲区队列中控制这三个进程的速度?
    • 如果创建队列时没有 IPC_NOWAIT 标志,则 msgsnd 将失败(返回 -1)并且 errno 将设置为 EAGAIN。这将告诉您队列已满,并且在您提取至少一条消息之前,您无法添加任何其他消息。
    猜你喜欢
    • 2021-04-03
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2015-07-31
    • 2014-02-24
    • 2013-05-28
    • 2020-11-27
    相关资源
    最近更新 更多