如何删除所有 IPC-Message 队列?

How to remove all the IPC-Message queue ?

假设我已经使用 msgget() 函数创建了 100 个消息队列。

 ------ Message Queues --------
 key        msqid      owner      perms      used-bytes   messages    
0x00000000 262144     bhuvaneshw 666        40           2           
0x00000000 294913     bhuvaneshw 666        40           2           
0x00000000 327682     bhuvaneshw 666        40           2           
0x00000000 360451     bhuvaneshw 666        40           2           
0x00000000 393220     bhuvaneshw 666        40           2           
0x00000000 425989     bhuvaneshw 666        55           3        
....
.....
....

使用 ipcrm 命令我们可以一次删除单个队列。

ipcrm -q queue_id

或者使用 msgctl() 我们可以删除它。但我想一次性删除所有消息队列。在 linux 中有什么方法可以做到这一点吗?

ipcrm中有一个选项 -Q 可以删除队列中的所有邮件。 例如,ipcrm -Q 0x00000000 删除键 0x00000000

的所有消息

试试这个,

ipcrm -q 262144 -q ... -q ...

你可以这样给。选项是必须的。

嘿,我给你答案了

你可以使用 KEY number 运行 在循环中从开始到最大范围删除消息队列(使用 system() 函数), 但是 KEY=0 的消息队列不能以这种方式删除 ->“ipcrm -Q 0”不可能, 所以更好的方法是为每个键获取 mesQid,然后使用 msgctl(msgQid,IPC_RMID,0); 通过这种方式,您也可以使用 key=0 删除;

所以问题归结为通过避免 msgget() 获取 msgqid (从 $man 2 msgctl 中读取 MSG_INFO 和 MSG_STAT)

所以现在, 循环内核的索引系统以获取活动消息队列, 然后使用顺序索引和循环获取 msgqid 即msqid = msgctl(ind, MSG_STAT, &ds),就是这样。

为了更清晰的理解,请通读 MSG_INFO 和 MSG_STAT $man 2 msgctl.

或者我在这里试过并工作的更清晰的代码 https://github.com/chetanDN/linux-system-programming/blob/master/IPC/messageQ/2.deleteMsgQ/deleteAllCurrentMsgQs.c

ipcrm 可以做到这一点:

ipcrm --all=msg

您可以将 sem 和 shm 用于信号量和共享内存,而不是 msg。