共享内存实现分为两个步骤:
1.创建共享、打开共享内存,使用shmget函数
2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
3. 分离共享内存
4. 控制、删除共享内存
下面介绍共享内存要用到的函数:
shmget
函数作用:在内核中创建内存
函数原型:int shmget ( key_t key, int size, int shmflg )
函数参数:key 键值 IPC_PRIVATE 私有的键值
size:创建内存大小
shmflg:标志,同open权限
返回值:成功共享的内存标识符;出错-1
头文件:#include<sys/opc.h>
#include <sys/shm.h>
shmat
函数作用:映射共享内存,映射到各自内存空间
函数原型:char * shmat ( int shmid, char *shmaddr, int flag)
函数参数:shmid:内存的标识符
shmaddr:映射共享内存到本进程的指定地址,若为NULL,则由内核进行自动分配
flag:0(默认)可读写;SHM_RDONLY,只读
返回值:被映射的段地址,出错-1
头文件:#include<sys/types.h>
#include<sysy/ipc.h>
#include<sys/shm.h>
shmdt
函数作用:撤销共享内存的映射
函数原型:int shmdt(const void *shmaddr)
函数参数:shmaddr:被映射的共享内存地址
返回值:成功0,出错-1
下面是例子:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PERM S_IRUSR|S_IWUSR
/* 共享内存 */
int main(int argc,char **argv)
{
int shmid;
char *p_addr,*c_addr;
if(argc!=2)
{
fprintf(stderr,"Usage:%s\n\a",argv[0]);
exit(1);
}
/* 创建共享内存 */
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
{
fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
exit(1);
}
/* 创建子进程 */
if(fork()) // 父进程写
{
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
wait(NULL); // 释放资源,不关心终止状态
exit(0);
}
else // 子进程读
{
sleep(1); // 暂停1秒
c_addr=shmat(shmid,0,0);
printf("Client get %s\n",c_addr);
exit(0);
}
}