如何清理IPC消息队列?

如何清理IPC消息队列?,c,ipc,message-queue,C,Ipc,Message Queue,我正在基于IPC的应用程序中使用msgget()函数。如何清理充满旧消息队列的队列?解决方法是增加MSGMNI系统范围内消息队列的最大数量:依赖于策略(在Linux上,此限制可以通过/proc/sys/kernel/MSGMNI读取和修改)。要删除队列,请使用以下命令: msgctl(msgQID, IPC_RMID, NULL); 这些持久的资源分配问题(共享内存中也有类似的问题)是System V API通常被认为不推荐使用的原因。在这种情况下,您是否考虑过使用unix域套接字或FIFO而

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

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

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

msgctl(msgQID, IPC_RMID, NULL);

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

您可以使用mq\u setattr更改O\u NONBLOCK的消息队列属性。 然后通过读取所有消息清空队列,直到返回值指示队列为空。 现在将旧属性放回原处

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