共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。
共享内存映射在进程地址空间的栈和堆之间
共享内存通过int shmget(key_t key, size_t size, int shmflg);函数创建其中key是由ftok()函数自动获取,size是所申请的共享内存的大小单位是字节一般size是4096的整数倍,shmflg为IPC_CREAT或者IPC_EXCL
用 int shmctl(int shmid, int cmd, struct shmid_ds *buf);函数删除
申请到共享内存之后需要挂接到对应的进程上由 void *shmat(int shmid, const void *shmaddr, int shmflg);函数实现
用 void *shmat(int shmid, const void *shmaddr, int shmflg);函数解除挂接
com.h
#ifndef __SHM__
#define __SHM__
#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<unistd.h>
static shm(int size, int flag);
int create_shm(int size);
int get_shm();
char* at_shm(int shmid);
int dt_shm(char* addr);
int destory_shm(int shmid);
#endif //__SHM__
com.c
#include"com.h"
static int shm(int size, int flag)
{
key_t key = ftok(".",88);
int shmid = shmget(key,size,flag);
if(shmid == -1)
{
perror("shmget:");
return -1;
}
return shmid;
}
int create_shm(int size)
{
return shm(size,IPC_CREAT | IPC_EXCL | 0666);
}
int get_shm()
{
return shm(0,IPC_CREAT);
}
char* at_shm(int shmid)
{
return (char*)shmat(shmid, NULL,0);
}
int dt_shm(char* addr)
{
return shmdt(addr);
}
int destory_shm(int shmid)
{
return shmctl(shmid,IPC_RMID,NULL);
}
server.c
#include"com.h"
int main()
{
int shmid = get_shm();
usleep(1000);
char* str = at_shm(shmid);
usleep(5000);
int count = 0;
while(count < 4096)
{
printf("%s\n",str);
usleep(1000);
count++;
}
dt_shm(str);
return 0;
}
client.c
#include"com.h"
int main()
{
int shmid = create_shm(4096);
usleep(1000);
char* str = at_shm(shmid);
usleep(5000);
int count = 0;
while(count < 4096)
{
str[count] = 'A' + count%26;
usleep(1000);
count++;
str[count] = '\0';
}
dt_shm(str);
destory_shm(shmid);
return 0;
}