当前位置:C++技术网 > 资讯 > Linux使用Shell命令行查看消息队列

Linux使用Shell命令行查看消息队列

更新时间:2019-03-21 17:56:24浏览次数:1+次

    在Linux/Unix中,进程间通信一般有共享内存、消息队列和信号。在程序里,我们使用下面的函数来操作:
msgget:调用者提供一个消息队列的键标 (用于表示个消息队列的唯一名字),当这个消息队列存在的时候, 这个消息调用负责返回这个队列的标识号;如果这个队列不存在,就创建一个消息队列,然后返回这个消息队列的标识号 ,主要由sys_msgget执行。
msgsnd:向一个消息队列发送一个消息,主要由sys_msgsnd执行。
msgrcv:从一个消息队列中收到一个消息,主要由sys_msgrcv执行。
msgctl:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等的操作,主要由sys_msgctl执行。

程序在运行的时候,如何观察消息队列的情况呢?用命令行来显示消息队列的信息和删除消息队列。
1.显示消息队列的信息 ipcs
ipcs  [参数]

-a :查看全部IPC对象信息
-q :查看消息队列信息【我们本文需要的选项】
-m :查看共享内存信息
-s :查看信号量信息
查询的结果如下:
------ Message Queues --------
key                 msqid      owner      perms      used-bytes   messages    
0x0001265a        0            root       666                0            0   

key是系统全局唯一的值,也就是在msgget第一个参数传入的值。messages是消息队列已存储的消息数。如果在没有发送消息的情况下,消息数一直不减少,说明可能有些消息程序不会再取出来了,有可能是程序设计上的漏洞,导致一些消息不会被取出。那么时间久了,消息队列的容量慢慢就耗尽以至于无法存入消息了。
那么此时我们就需要删除消息队列,否则尽管程序重启了,依然是无法使用消息队列的。除非我们程序会删除消息队列的消息。


2.删除消息队列 ipcrm
ipcrm  [-s / -m /-q]  ID    或   ipcrm  [-S /-M /-Q]  Key
-s / -S  : 删除信号量信息
-m / -M: 删除共享内存信息
-q / -Q: 删除消息队列信息

如果指定了smq,则用IPC的标识符(ID)作为输入,即结果显示里的msqid
如果指定了SMQ,则用IPC对象的键值(key)作为输入,即结果显示里的key

比如删除消息队列命令如下:

ipcrm -q 0
ipcrm -Q 0x0001265a