【Linux】共享内存

共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据复制。

共享内存的实现分为两个步骤:

1、创建共享内存——shmget(),也就是从内存中获得一段共享内存区域。

2、映射共享内存——shmat(),取消映射操作shmdt()。

shmget()

头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

函数原型:int shmget(key_t key, int size, int shmflg);

key:共享内存的键值,多个进程通过它来访问共享内存。IPC_PRIVATE用于创建当前进程的私有共享内存

size:共享内存区域大小

shmflg:同open()函数的权限位,也可以用八进制法表示

成功:共享内存标识符

出错:-1

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!');
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);

    return 0;
} 

 shmat()

头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

函数原型:char *shmat(int shmid, const void *shmaddr, int shmflg);

shmid:要映射的共享内存区标识符

shmaddr:将共享内存映射到指定地址

shmflg:

        SHM_RDONLY:共享内存只读

        0:共享内存可读写

成功:被映射段地址

出错:-1

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);  //创建或者打开共享内存
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);
    
    void *addr = shmat(shmid, NULL, 0);    //内存映射 映射的地址由系统自动分配 该地址可读可写
    if(addr == (void*)-1)
    {
        printf("shmat");
        exit(-1);
    }

    printf("addr = %p\n", addr);
    return 0;
} 

shmdt()

 头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

函数原型:int shmdt(const *void shmaddr);

shmaddr:被映射的共享内存段地址

成功:0

出错:-1

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);  //创建或者打开共享内存
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);
    
    void *addr = shmat(shmid, NULL, 0);    //内存映射 映射的地址由系统自动分配 该地址可读可写
    if(addr == (void*)-1)
    {
        printf("shmat");
        exit(-1);
    }

    printf("addr = %p\n", addr);
 
    int ret = shmdt(addr);
    if(ret < 0)
    {
        perror("shmdt");
        exit(-1);
    }
    return 0;
} 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lindsey小姐月光加冕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值