共享内存的实现分为两个步骤:
一、 创建共享内存,使用shmget函数。
二、 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
1. 创建共享内存
int shmget(key_t key ,int size,int shmflg)
key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget将创建一块新的共享内存;如果key的取值为0,而参数中又设置了IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功,返回共享内存表示符,如果失败,返回-1。
2. 映射共享内存
int shmat(int shmid,char *shmaddr,int flag)
参数:
返回值:
如果成功,则返回共享内存映射到进程中的地址;如果失败,则返回-1。
3.共享内存解除映射
当一个进程不再需要共享内存时,需要把它从进程地址空间中多里。
int shmdt(char *shmaddr)
ipcs -m 查看系统中的共享内存片,结果如下:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
七个参数的含义如下:
共享内存的key
共享内存的编号shmid
创建的用户owner
权限perms
创建的大小bytes
连接到共享内存的进程数nattach
共享内存的状态status
一、 创建共享内存,使用shmget函数。
二、 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
1. 创建共享内存
int shmget(key_t key ,int size,int shmflg)
key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget将创建一块新的共享内存;如果key的取值为0,而参数中又设置了IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功,返回共享内存表示符,如果失败,返回-1。
2. 映射共享内存
int shmat(int shmid,char *shmaddr,int flag)
参数:
shmid:shmget函数返回的共享存储标识符
flag:决定以什么样的方式来确定映射的地址(通常为0)返回值:
如果成功,则返回共享内存映射到进程中的地址;如果失败,则返回-1。
3.共享内存解除映射
当一个进程不再需要共享内存时,需要把它从进程地址空间中多里。
int shmdt(char *shmaddr)
ipcs -m 查看系统中的共享内存片,结果如下:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
七个参数的含义如下:
共享内存的key
共享内存的编号shmid
创建的用户owner
权限perms
创建的大小bytes
连接到共享内存的进程数nattach
共享内存的状态status
ipcrm -m shmid 删除编号为shmid的共享内存片
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc,char * argv[])
{
int shm_size = 66535;
int shm_id = 0;
void *shared_memory=(void *)0;
shm_id=shmget(IPC_PRIVATE, shm_size, 0666 ) ;
if(shm_id < 0){ //共享内存申请失败
fprintf(stderr,"shmget failure!");
return -1;
}
fprintf(stderr,"共享内存id: %d\n",shm_id);
system( "ipcs -m");
/*映射共享内存*/
shared_memory=shmat(shm_id,(void *)0,0);
system("ipcs -m");
/*删除映射共享内存*/
if(shmdt(shared_memory) == -1)
{
fprintf(stderr,"shmdt failed\n");
return -1;
}
system("ipcs -m");
/*删除共享内存*/
char str[1024];
sprintf(str,"ipcrm -m %d",shm_id);
system(str);
system("ipcs -m");
return 0;
}