共享内存的使用流程
参考博文:
https://www.cnblogs.com/LiuYanYGZ/p/14292524.html
1.向内核申请一块指定大小的内存
2.如果有两个进程,需要通信,可以使用这块共享内存来完成,先创建出这两个进程。
进程A
进程B
3.进程A和进程B分别和共享内存进程关联,
拿到共享内存的地址——>首地址。
4.两个进程可以通过这个首地址对共享内存进行读/写操作。
5.如果这个进程不再使用这块共享内存,需要和共享内存断开关联。
进程退出,对共享内存是没有任何影响的。
6.当不再使用共享内存的时候,需要将共享内存销毁。
共四个函数
创建或打开shmget、关联shmad、取消关联shmdt、控制(主要用于删除)shmctl
头文件都一样:
#include <sys/shm.h>
#include <sys/ipc.h>
1.创建或打开共享内存。
shmget()函数
//创建共享内存
//共享内存已经存在,打开共享内存
//可以创建多块共享内存
int shmget(key_t key,size_t size,int shmflg);
创建或打开共享内存函数shmget()
返回值是一个整数,用int shmid记录它的返回值,用shmid可以访问key值为100的这块共享内存
int shmid = shmget(100,1024,IPC_CREAT);
//记录创建共享内存之后的返回值,用这个返回值可以访问共享内存
参数:
key_t key:通过这个key记录共享内存在内核的位置。需要的是任意一个大于0的整数就可以,不能等于0,随便指定一个大于0的数就行,如果不想随便指定的话,那我们后面会介绍一个ftok()函数。
size:指定共享内存的大小。
如果是shmget是要打开一块共享内存,那么size就写0就可以。
int shmid = shmget(100,0,0);//打开刚刚创建的key为100的这块共享内存
int shmflg:创建共享内存时,类似于open函数的flag。
IPC_CREAT:创建共享内存并给出操作权限。
比如:IPC_CREAT|0644就是创建共享内存并将权限设为0644,文件所有者可读可写,同组用户只读,其他用户只读。
IPC_CREAT|IPC_EXCL:检测共享内存是否存在。
如果存在函数返回-1,
不存在返回0。
返回值:成功创建或打开,得到一个整型数–>对应这块共享内存。
失败返回-1.
2.将当前进程和共享内存关联在一起
(void* )shmat(int shmid,const void* shmaddr,int shmflg);
参数:
shmid:就是上面那个shmget()的返回值,通过这个参数访问共享内存。
shmaddr:指定共享内存在内核中的位置,如果不想自己指定它在内核中的位置的话,就写成NULL,写成NULL就是委托内核自己找一个合适的位置。
shmflg:关联成功后对共享内存的操作权限
SHM_RDONLY:只读
写成0:可读写
返回值:如果关联成功,那么返回值是一个地址,是一个void类型的指针。这个指针是共享内存的首地址。
如果关联失败则返回(void)-1。
应用:
//将当前进程关联shmid这块共享内存,共享内存在内核中的位置由内核自己找合适的位置放置,权限为可读写。用void* 类型的指针ptr来保存它的返回值,ptr就是这块共享内存的首地址。
void* ptr = shmat(shmid,NULL,0);
//数据写入内存
char* pt = "xxxx";
memcpy(ptr,pt,strlen(pt)+1); //把pt这个指针上的内容写到ptr上去。
//读内存
printf("%s",(char*)ptr);
3.将共享内存和当前进程分离
//进程和共享内存分离->二者就没有关系了。
int shmdt(const void* shmaddr);
参数:shmaddr:共享