【问题标题】:How can I cleanup the IPC message-queue?如何清理 IPC 消息队列?
【发布时间】:2010-12-06 02:23:11
【问题描述】:

我在基于 IPC 的应用程序中使用 msgget() 函数。如何清理被旧消息队列填满的队列?

【问题讨论】:

    标签: c ipc message-queue


    【解决方案1】:

    解决方法是增加 MSGMNI 系统范围的最大消息队列数:取决于策略(在 Linux 上,可以通过 /proc/sys/kernel/msgmni 读取和修改此限制)。

    【讨论】:

      【解决方案2】:

      要删除队列,请使用以下命令:

      msgctl(msgQID, IPC_RMID, NULL);
      

      SYSTEM CALL: msgctl()

      【讨论】:

        【解决方案3】:

        这些持久性资源分配问题(共享内存也存在类似问题)是 System V API 通常被视为已弃用的原因。在这种情况下,您是否考虑过使用 unix 域套接字或 FIFO 来代替消息队列?这些出现在文件系统中,并且在不再与 rm 等工具一起使用时可以“清理”。

        【讨论】:

          【解决方案4】:

          您可以使用 mq_setattr 更改 O_NONBLOCK 的消息队列属性。 然后通过读取所有消息清空队列,直到返回值指示队列为空。 现在设置回旧属性。

          此方法不是运行时优化的,但它避免了关闭和打开消息队列的需要。

          【讨论】:

            猜你喜欢
            • 2021-12-07
            • 2012-09-19
            • 2021-03-12
            • 2013-01-05
            • 2012-12-07
            • 2013-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多