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

时间:2015-01-22 10:29:22

标签: c linux unix ipc

考虑我使用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中有没有办法做到这一点?

4 个答案:

答案 0 :(得分:3)

ipcrm可以做到这一点:

ipcrm --all=msg

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

答案 1 :(得分:1)

-Q中有一个选项ipcrm,用于删除队列中的所有邮件。 例如,ipcrm -Q 0x00000000会删除密钥0x00000000

的所有邮件

答案 2 :(得分:1)

嘿,我找到了答案

你可以使用从开始到最大范围循环运行的KEY号删除消息队列(使用system()函数), 但是具有KEY = 0的消息队列不能以这种方式删除 - >“global theOpts on saySomething() return 1 end saySomething set theOpts to {saySomething()} --the one that does set t to theOpts's item 1 --t runByIdx(1) on runByIdx(idx) set thefun to item idx of theOpts thefun end runByIdx ”不可能, 所以更好的方法是为每个密钥获取mesQid,然后使用msgctl(msgQid,IPC_RMID,0); 这样你就可以用key = 0删除;

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

所以现在, 循环遍历内核的索引系统,用于活动消息队列, 然后使用顺序索引和循环获取msgqid 即ipcrm -Q 0,就这样。

通过MSG_INFO和MSG_STAT读取更清晰的理解 msqid = msgctl(ind, MSG_STAT, &ds)

或我在这里尝试和工作的更干净的代码 https://github.com/chetanDN/linux-system-programming/blob/master/IPC/messageQ/2.deleteMsgQ/deleteAllCurrentMsgQs.c

答案 3 :(得分:0)

试试这个,

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

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