流程可以概括为五个
1.创建/打开共享内存
2.映射到当前的进程中
3.数据交换(不同进程之间)
4.断开进程和共享内存之间的连接
5.干掉共享内存防止内存一直被占用
一、创建/打开共享内存
Function: shmget();
int shmget(key_t key, size_t size, int flag);
key: 标识符的规则
size:共享存储段的字节数
flag:读写的权限
返回值:成功返回共享存储的id,失败返回-1
例:
key_t key = ftok(".",1);
shmid = shmget(key,1024*4,IPC_CREAT|0600);
此步骤相当于申请了内存中的共享内存空间;
二、映射
Function:shmat() ;
void *shmat(int shmid, const void *shmaddr, int shmflg)
shmid:共享内存标识符
shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
函数作用:把共享内存区对象映射到调用进程的地址空间
函数说明:连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
例:
char *shmaddr;//进程里的指针指向共享内存
shmaddr = shmat(shmid,0,0);//shmflg = 0 表示可读可写;
三、交换数据
first step:
write something to the share memory//写一些东西到共享内存当中
stycpy(shmaddr,“Moses wanna to be a wealthy man!”);
因为shmaddr指针已经指向共享内存,所以修改shmaddr的内容就相当于写入共享内存当中了。
second step:
read something from the share memory//从共享内存当中读出
printf("%s",shmaddr);//读出就是这么简单!
四、断开进程与共享内存之间的连接
Function:shmdt();
int shmdt(const void *shmaddr);
例:
shmdt(shmaddr);//在进程中删除shmaddr
五、干掉共享内存
Function:shmctl();
int shmctl ( int shmqid, int cmd, struct shmid_ds *buf );
指令有这么几个,我们需要用到的是IPC_RMID;
**IPC_STAT :**检索一个共享段的shmid_ds结构,把它存到buf参数的地址中。
**IPC_SET :**对一个共享段来说,从buf 参数中取值设置shmid_ds结构的ipc_perm域的值。
**IPC_RMID :**把一个段标记为删除
例:
shmctl(shmid,IPC_RMID,0);//删除
例子1:写入共享内存
#include <sys/types.h>
#include<string.h>
int main()
{
int shmid;
char *shmaddr;
key_t key =ftok(".",1);
shmid = shmget(key,1024*4,IPC_CREAT|0666);
if(shmid == -1){
printf("creat shm failed\n");
//perror("why");
exit(-1);
}
shmaddr = shmat(shmid,0,0);
strcpy(shmaddr,"qinzhike!");
sleep(5);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,0);
return 0;
}
例子2:从共享内存读出
#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<string.h>
//void *shmat(int shmid, const void *shmaddr, int shmflg);
//int shmget(key_t key, size_t size, int shmflg);
int main()
{
int shmid;
char *shmaddr;
key_t key = ftok(".",1);
shmid = shmget(key,1024*3,0);
if(shmid == -1){
printf("creat shm failed\n");
}
shmaddr = shmat(shmid,0,0);
//strcpy(shmaddr,"qinzhikehenshuai!");
printf("read from shm %s\n",shmaddr);
shmdt(shmaddr);
//shmctl(shmid,IPC_RMID,0);
return 0;
}
总体来说五个步骤可以完成共享内存的申请和不同进程之间的数据交换。点个赞再走吧~谢谢<^ . ^ >;