Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解

在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法。

预备知识

Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl + C或kill等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是如果我们修改了程序,由于共享内存的大小不一致等原因会导致程序申请共享内存错误。因此,我们总是希望每次结束时就能释放掉申请的共享内存。

有两种方法可以用来释放共享内存:

第一种:如果总是通过Crtl+C来结束的话,可以做一个信号处理器,当接收到这个信号的时候,先释放共享内存,然后退出程序。

       第二种:不管你以什么方式结束程序,如果共享内存还是得不到释放,那么可以通过linux命令ipcrm shm shmid来释放,在使用该命令之前可以通过ipcs -m命令来查看共享内存。

SystemV的IPC通信

System V IPC共有三种类型: 
* System V消息队列

  • System V 信号量

  • System V 共享内存区。

ipcs命令

用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。

SystemV控制选项

选项 描述
-a 显示全部可显示的信息
-q 显示活动的消息队列信息
-m 显示活动的共享内存信息
-s 显示活动的信号量信息

输出选项

| 选项| 描述 | 
| -t | time | 
| -p | pid | 
| -c | creator| 
| -l | limits| 
| -u| summary|

ipcs -t 输出信息的详细变化时间

Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解_第1张图片

ipcs -p 输出ipc方式的进程ID

Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解_第2张图片

ipcs -c 输出ipc方式的创建者/拥有者


Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解_第3张图片

ipcs -l 输出ipc各种方式的在该系统下的限制条件信息


Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解_第4张图片

ipcs -u 输出当前系统下ipc各种方式的状态信息(共享内存,消息队列,信号)


Linux 进程间通信(共享内存或消息队列等查看、删除)- IPCS/IPCRM命令详解_第5张图片

ipcrm 命令


移除一个消息对象。或者共享内存段,或者一个信号集,同时会将与ipc对象相关链的数据也一起移除。当然,只有超级管理员,或者ipc对象的创建者才有这项权利啦

ipcrm用法

ipcrm -M shmkey    移除用shmkey创建的共享内存段
ipcrm -m shmid    移除用shmid标识的共享内存段
ipcrm -Q msgkey    移除用msqkey创建的消息队列
ipcrm -q msqid    移除用msqid标识的消息队列
ipcrm -S semkey    移除用semkey创建的信号
ipcrm -s semid    移除用semid标识的信号
--------------------- 
作者:JeanCheng 
来源:CSDN 
原文:https://blog.csdn.net/gatieme/article/details/51026554 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(Linux,shell)