什么是共享内存
共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。
不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。
如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。
关于信号量的知识,将在线程安全中介绍
共享内存和消息队列各个参数:
共享内存api
分配一块共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
key:密钥
size: 共享内存的大小 必须是 PAGE_SIZE 整数倍 ,getconf PAGE_SIZE 查看大小
shmflg: 权限
IPC_CREAT 创建
IPC_EXCL 检查是否存在
返回值: 成功 共享内存对象
失败 -1
映射共享内存
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:共享内存对象id
shmaddr:填写为NULL ,系统自动选择映射地址
shmflg:属性默认为 0
返回值: 映射成功 返回指向共享内存的指针
映射失败 (void *) -1
int shmdt(const void *shmaddr); //解除映射
控制共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd参数见上一篇消息队列
销毁共享内存
shmctl(shmid,IPC_RMID,NULL);
创建一个共享内存,通过键盘往内存中写入数据
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
//1.创建密钥
key_t key= ftok("/home",120);
//2.创建共享内存对象
int shmid = shmget(key,4096,IPC_CREAT|0777);
if(shmid < 0)
{
perror("创建共享内存失败\n");
return -1;
}else
{
printf("创建共享内存成功\n");
}
//3.映射共享内存
char *p = shmat(shmid,NULL,0);
while (1)
{
//4.从键盘获取数据到共享内存中
scanf("%s",p);
}
}
创建一个共享内存,不断读取共享内存中的数据
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
//1.创建密钥
key_t key= ftok("/home",120);
//2.创建共享内存对象
int shmid = shmget(key,4096,IPC_CREAT|0777);
if(shmid < 0)
{
perror("创建共享内存失败\n");
return -1;
}else
{
printf("创建共享内存成功\n");
}
//3.映射共享内存
char *p = shmat(shmid,NULL,0);
while (1)
{
printf("%s\n",p);
sleep(1);
}
getchar();
}
参考:进程间通信——共享内存(Shared Memory)_进程间通讯 共享内存-CSDN博客