考虑我使用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中有没有办法做到这一点?
答案 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 ...
你可以这样给。选项是必须的。