进程间通信之共享内存:shm

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 创建的信号标识和与其相关的信号量集和数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值