1.共享内存的概述
共享内存(Shared Memory),是指两个或多个进程共享一个给定的存储区。在所有的IPC中,共享内存是用的比较多的IPC方式。
Linux系统中可以用 “ipcs -m” 指令查看共享内存,可以使用 “ipcrm -m 共享内存ID”来删除系统中的共享内存。
2.共享内存的特点
- 共享内存是最快的IPC方式,因为进程会对内存进行直接的访问。
- 共享内存可以允许多个进程同时操作,所以需要进行同步。
- 信号量和共享内存通常搭配使用,信号量的作用主要是用来同步对共享内存的访问。
3.共享内存常用API
4.共享内存的编程思路
a.创建共享内存
b.映射/挂载内存
c.数据交换
d.断开映射/挂载
e. 杀死共享内存
5.各API的编程方式
- 创建共享内存
第一个参数是key值;第二个参数是内存大小(共享内存的大小与MB对齐);第三个参数是标志位,可以用可读可写的方式创建共享内存,如果共享内存存在则不设置第三参数。
- 映射/挂载空间
第一个参数为共享内存的ID;第二个参数写0,让系统自己分配内存;第三个参数写0,用可读可写的方式打开。
- 写/读数据
- 断开挂载
- 杀死共享内存
第一个参数是共享内存ID;第二个参数:IPC_RMID;第三个参数:一般为0
6.进程使用共享内存的完整代码:
shareread.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
//printf("%x\n",key);
shmid=shmget(key,1024*4,0);
if(shmid==-1){
printf("error!\n");
exit(-1);
}
shmaddr=shmat(shmid,0,0);
printf("shmat ok");
printf("data=%s\n",shmaddr);
shmdt(shmaddr);
return 0;
}
~
sharewrite.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
//printf("%x\n",key);
shmid=shmget(key,1024*4,IPC_CREAT|0666);
if(shmid==-1){
printf("error!\n");
exit(-1);
}
shmaddr=shmat(shmid,0,0);
printf("shmat ok\n");
strcpy(shmaddr,"LinXuZhiWei");
sleep(15);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,0);
printf("quit!");
return 0;
}