共享内存:
操作系统接口标准:system V 标准、posix标准。System V共享内存机制: shmget shmat shmdt shmctl
共享内存的原理 :
同一块物理内存映射到了多个进程的虚拟地址空间。
pathname->key->shmid->连接->使用->解除连接。
系统中每一个文件都是唯一的,所以可以用路径来产生key。同一个路径产生同一个key。同一个key可以打开或产生同一段共享内存。
每一段共享内存有一个ID:shmid。
共享内存在创建以后,随着进程结束不会释放。
因为是共享内存啊,你这个进程结束了,可能其他进程还要用。
key_t ftok(const char *pathname, int proj_id);
//产生key。proj_id通常传入一非0字符。
int shmget(key_t key, int size, int shmflg);
//根据key产生或打开一共享内存,得到shmid。key也可以自己指定。
void *shmat(int shmid, const void *shmaddr, int shmflg);
//attach.根据shmid连接共享内存。后面一般填NULL和0。连接共享内存得到的是
共享内
存在本进程的虚拟内存的首地址。共享内存在虚拟内存是连续的,但实
际物理
内存是否连续,不管你的事,管他呢~
int shmdt(const void *shmaddr);
//解除连接
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
//参数cmd是对共享内存段的操作方式,可选为
IPC_STAT,IPC_SET,IPC_RMID
。 为IPC_RMID,表示删除共享内存段。这是buf填NULL即可。
为IPC_STAT,表示获取共享内存的信息。buf用来存放共享内存的信息。
为IPC_SET,表示设置。
例1:共享内存的使用
#include <sys/types.h> //这三个是这一堆函数的头文件
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
int main(int argc,char* argv[]){
if(argc !=2){
printf("error args\n");
return -1;
}
key_t key=
ftok(argv[1],1);
//根据传入的路径,产生key。同一个路径,产生同一个key。
int shmid=