进程通信之共享内存

共享内存
    首先应该清楚,共享内存是进程共享数据最快的一种方法,同样这也表明了它的不安全性因素。
一、获得\创建共享内存
    #include <sys/ipc.h>
    #include <sys/shm.h>
    int shmget(key_t shmid,size_t size,int shmflg);
    key 0(IPC_PRIVATE):会建立新共享内存对象,大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
    size 大于0的整数:新建的共享内存大小,以字节为单位 ;只获取共享内存时指定为0
    shmflg 0:取共享内存标识符,若不存在则函数会报错
IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错
    此函数得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。
二、映射共享内存
    #include <sys/types.h>
    #include <sys/shm.h>
    char *shmat(int shmid,char *shmaddr,int shmflg);
    at表示attach。由此可见,此函数的作用为将标示符为shmid的共享内存映射到当前运行的进程中。
换句话说就是进程连接共享内存。返回的是映射的共享内存的地址。
    shmaddr 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。
    shmflg SHM_RDONLY:为只读模式,其他为读写模式 。
三、断开共享内存
    #include <sys/types.h>
    #include <sys/shm.h>
    int shmdt(char *shmaddr);
    shmaddr为连接共享内存的起始地址,对比shmat里参数即知。返回0为成功。
    注意此函数只是进程断开与共享内存的连接,而不是删除。当然,若是进程结束,则自动断开连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共享内存是一种高效的进程间通信方式,它允许多个进程访问同一块物理内存。在Linux下,可以使用系统提供的shmget、shmat、shmdt等函数实现共享内存通信。下面介绍一下如何使用共享内存实现生产者/消费者模式。 1. 创建共享内存 使用shmget函数创建一块共享内存,函数原型如下: ``` int shmget(key_t key, size_t size, int shmflg); ``` 其中,key为共享内存标识符,size为共享内存大小,shmflg为权限标志。例如,可以使用以下代码创建一块共享内存: ```c key_t key = ftok(".", 'a'); int shmid = shmget(key, 1024, IPC_CREAT | 0666); ``` 2. 获取共享内存指针 使用shmat函数获取到共享内存的起始地址,函数原型如下: ``` void *shmat(int shmid, const void *shmaddr, int shmflg); ``` 其中,shmid为共享内存标识符,shmaddr为指定共享内存的地址,通常为NULL,shmflg为权限标志。例如,可以使用以下代码获取到共享内存起始地址: ```c char *shm = (char *)shmat(shmid, NULL, 0); ``` 3. 生产者写入数据 生产者向共享内存写入数据,可以使用memcpy函数将数据拷贝到共享内存中,例如: ```c char buffer[] = "hello world"; memcpy(shm, buffer, strlen(buffer)); ``` 4. 消费者读取数据 消费者从共享内存中读取数据,同样可以使用memcpy函数将数据拷贝到自己的缓冲区中,例如: ```c char buffer[1024]; memcpy(buffer, shm, strlen(shm)); ``` 5. 释放共享内存 使用shmdt函数释放共享内存,函数原型如下: ``` int shmdt(const void *shmaddr); ``` 其中,shmaddr为共享内存起始地址。例如,可以使用以下代码释放共享内存: ```c shmdt(shm); ``` 6. 删除共享内存 使用shmctl函数删除共享内存,函数原型如下: ``` int shmctl(int shmid, int cmd, struct shmid_ds *buf); ``` 其中,shmid为共享内存标识符,cmd为删除命令,buf为共享内存信息结构体。例如,可以使用以下代码删除共享内存: ```c shmctl(shmid, IPC_RMID, NULL); ``` 以上就是使用共享内存实现生产者/消费者模式的方法。需要注意的是,共享内存不提供同步机制,因此需要使用其他方式来保证生产者和消费者之间的同步,例如信号量、互斥锁等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值