【发布时间】:2010-12-06 02:23:11
【问题描述】:
我在基于 IPC 的应用程序中使用 msgget() 函数。如何清理被旧消息队列填满的队列?
【问题讨论】:
标签: c ipc message-queue
我在基于 IPC 的应用程序中使用 msgget() 函数。如何清理被旧消息队列填满的队列?
【问题讨论】:
标签: c ipc message-queue
解决方法是增加 MSGMNI 系统范围的最大消息队列数:取决于策略(在 Linux 上,可以通过 /proc/sys/kernel/msgmni 读取和修改此限制)。
【讨论】:
【讨论】:
这些持久性资源分配问题(共享内存也存在类似问题)是 System V API 通常被视为已弃用的原因。在这种情况下,您是否考虑过使用 unix 域套接字或 FIFO 来代替消息队列?这些出现在文件系统中,并且在不再与 rm 等工具一起使用时可以“清理”。
【讨论】:
您可以使用 mq_setattr 更改 O_NONBLOCK 的消息队列属性。 然后通过读取所有消息清空队列,直到返回值指示队列为空。 现在设置回旧属性。
此方法不是运行时优化的,但它避免了关闭和打开消息队列的需要。
【讨论】: