《unix共享内存消息队列常用命令》由会员分享,可在线阅读,更多相关《unix共享内存消息队列常用命令(3页珍藏版)》请在金锄头文库上搜索。
1、unix 共享内存、消息队列常用命令一、共享内存、消息队列基本常识共享内存指在多处理器的计算机中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个 CPU 需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存 (shared memory)是 Unix 下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。消 息 队 列 就 是 一 个 消 息 的 链 表 。 可 以 把 消 息 看 作 一 个
2、记 录 , 具 有 特 定 的 格 式 以 及 特定 的 优 先 级 。 对 消 息 队 列 有 写 权 限 的 进 程 可 以 向 中 按 照 一 定 的 规 则 添 加 新 消 息 ; 对 消 息队 列 有 读 权 限 的 进 程 则 可 以 从 消 息 队 列 中 读 走 消 息 。共 享 内 存 和 消 息 队 列 , 都 是 通 过 文 件 系 统 中 的 句 柄 来 获 取 相 应 的 key 值 , 由 于 文件 系 统 中 的 路 径 或 文 件 的 绝 对 路 径 都 是 唯 一 的 , 所 以 通 过 文 件 句 柄 获 得 的 key 值 ,并 根 据 这 个 唯 一 的
3、 key 值 , 可 以 在 系 统 中 创 建 相 应 的 共 享 内 存 和 消 息 队 列 , 当 系 统 重启 后 , 共 享 内 存 和 消 息 队 列 会 清 除 。二、系统常用查询命令1. Ipcs 共享内存、消息队列查询命令不带参数为显示所有共享内存、消息队列基本信息Ipcs a 显示所有共享内存、消息队列详细信息Ipcs am 显示所有共享内存详细信息,关键信息 ID、KEY 、OWNER 、SEGSZIpcs aq 显示所有消息队列详细信息,关键信息 ID、KEY 、OWNER 、QNUM、QBYTES2. Ipcrm 共享内存、消息队列清除命令Ipcrm M KEY 值
4、或者 ipcrm -m ID 值-可以删除对应的共享内存Ipcrm Q KEY 值 或者 ipcrm q ID 值-可以删除对应的消息队列三、OCS 常用命令1. r5ipc 消息队列、内存工具,调用消息队列、共享内存的 c 函数编写的小工具Usage : r5ipc -q -m -c filename -i filename -p filename -t filename -h -v-h Show help-v Show version-q message queue, (-q or -m one must specify)-m share memory, (-q or -m one mus
5、t specify)-c create queue-i get infomation of queue-d delete all records in queuer5ipc -q c 句柄路径可以创建消息队列r5ipc -q -i 句柄路径 可以查看消息队列内容r5ipc -q -d 句柄路径可以清空消息队列内容,但不会删除消息队列。r5ipc m c 句柄路径可以创建共享内存ri5p m d 句柄路径可以删除共享内存,直接删除r5ipc 不支持查看共享内存内容2. ipclook 输入句柄路径得到对应的 key 值,调用 C 系统函数 ftok 得到的 key 值,主要可用于反查消息队列或共
6、享内存的句柄。Usage:ipclook pathnameipclook 句柄路径 得到对应的 key 值反查消息队列或共享内存的方法,首先查到共享内存或消息队列的 key1 值和 owner,确定是哪个用户创建的,再调用 iplook 查询该用户可能的句柄文件的 key2 值,可以和 key1 值相匹配的,即是要查找的句柄实际反查消息队列或共享内存时,可结合 shell 来循环查询,加快查找的速度,如快速列出 etc 路径下所有文件名包含 SHM 文件的 key 值,可以使用:ls | grep SHM | while read line; do ipclook $line; doneipclook 的源代码为:#include# include # include /#includeusing namespace std;int main(int argc,char *argv)if(argc!=2)printf(Usage:nt%s pathnamen,argv0);exit (0); key_t kt= ftok(argv1, 1);if(kt = (key_t)-1)perror(failed to ftok);return -1;/coutktendl;printf(%s 0x%08xn,argv1,kt); return 0;