共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据复制。
共享内存的实现分为两个步骤:
1、创建共享内存——shmget(),也就是从内存中获得一段共享内存区域。
2、映射共享内存——shmat(),取消映射操作shmdt()。
shmget()
头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
函数原型:int shmget(key_t key, int size, int shmflg);
key:共享内存的键值,多个进程通过它来访问共享内存。IPC_PRIVATE用于创建当前进程的私有共享内存
size:共享内存区域大小
shmflg:同open()函数的权限位,也可以用八进制法表示
成功:共享内存标识符
出错:-1
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!');
if(key < 0)
{
perror("ftok");
}
//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT);
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);
return 0;
}
shmat()
头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
函数原型:char *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址
shmflg:
SHM_RDONLY:共享内存只读
0:共享内存可读写
成功:被映射段地址
出错:-1
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
if(key < 0)
{
perror("ftok");
}
//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT); //创建或者打开共享内存
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);
void *addr = shmat(shmid, NULL, 0); //内存映射 映射的地址由系统自动分配 该地址可读可写
if(addr == (void*)-1)
{
printf("shmat");
exit(-1);
}
printf("addr = %p\n", addr);
return 0;
}
shmdt()
头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
函数原型:int shmdt(const *void shmaddr);
shmaddr:被映射的共享内存段地址
成功:0
出错:-1
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
if(key < 0)
{
perror("ftok");
}
//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT); //创建或者打开共享内存
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);
void *addr = shmat(shmid, NULL, 0); //内存映射 映射的地址由系统自动分配 该地址可读可写
if(addr == (void*)-1)
{
printf("shmat");
exit(-1);
}
printf("addr = %p\n", addr);
int ret = shmdt(addr);
if(ret < 0)
{
perror("shmdt");
exit(-1);
}
return 0;
}