共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据复制。
共享内存的实现分为两个步骤:
1、创建共享内存——shmget(),也就是从内存中获得一段共享内存区域。
2、映射共享内存——shmat(),取消映射操作shmdt()。
shmget()
#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 <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 <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;
}