shm代码
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
struct shm共享内存使用的结构体的声明
{
volatile int beon;
};
int main(int argc, const char *argv[]){
struct shm *shms;//结构体指针定义
key_t key;//key定义
int shmid;//共享内存id定义
key = ftok("/tmp",'r');//获取key
if(-1 == key){
perror("ftok");
return -1;
}
shmid = shmget(key,sizeof(struct shm),IPC_CREAT|IPC_EXCL|0666);//共享内存的获取
if(-1 == shmid){
if(errno == EEXIST){
shmid = shmget(key,sizeof(struct shm),0);
}else{
perror("shmget");
return -1;
}
}
shms = shmat(shmid,NULL,0);//共享内存的映射
if(-1 == *(int *)shms){
perror("shmat");
return -1;
}
//通过最后一个函数(共享内存的映射),shms指针指向的结构体成为共享内存中的结构体.
//可以通过shms指针来对结构体里面的数据进行读写.
}
共享内存的查看及删除
注意:如果内存中已经有以key建立的共享内存,而你想以key在建立一个共享内存,会出现段错误.
一般在你修改共享内存结构体的时候会发生这种情况
而处理方法就是删除共享内存
//首先查看共享内存
ipcs -m -p
//删除
ipcrm -m <shmid>
ipcrm命令用来删除一个或更多的消息队列、信号量集或者共享内存标识。
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]
-m SharedMemory id 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。
-M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
-q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。
-Q MessageKey 删除由关键字 MessageKey 创建的消息队列标识和与其相关的消息队列和数据结构。
-s SemaphoreID 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。
-S SemaphoreKey 删除由关键字 SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。