如何删除所有 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。
假设我已经使用 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。