1、概述
将文件的内容映射到内存空间中,MAP_SHARED:对内存空间的操作会自动映射到文件中
比如增删了内存中的数据,会自动更新到文件中
内存映射除了用于进程间通讯,还用于简化对硬件操作(linux下一切皆为文件)
比如获取摄像头的数据,可以将摄像头映射到内存中,这样摄像头采集的数据自动映射到内存空间,就可以直接在内存空间中获取摄像头的数据,将对硬件的操作转换成了对内存空间操作
2、操作
// ./cmd pathname
int main(int argc, char *argv[])
{
if (2 != argc)
{
printf("运行参数有误...\n");
exit(EXIT_FAILURE);
}
int fd = open(argv[1], O_RDWR);//先打开一个操作文件
if (-1 == fd)
{
perror("open");
exit(EXIT_FAILURE);
}
//参数一:NULL表示让系统内核自动在内存空间中选择一块合适的空间进行文件内容映射
//参数二:申请的映射空间大小
//参数三:映射的目的,不能和open mode冲突
//参数四:MAP_SHARED表示映射更新的数据会被其他映射了同一个文件的进程查看到
//参数五:文件描述符
//参数六:距离文件首部的偏移量,从偏移的位置开始将数据映射到内存
//返回值:返回申请的内存空间,失败返回MAP_FAILED == (void*)-1
void *addr = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
//MAP_SHARED:对内存空间数据的修改会自动映射到文件中
//MAP_PRIVATE:对内存空间数据的修改不会映射到文件中
//void *addr = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
if (MAP_FAILED == addr)
{
perror("mmap");
exit(EXIT_FAILURE);
}
printf("addr = %p\n", addr);
// char *pData = "88888888";
// memcpy(addr, pData, strlen(pData));
char caMsg[8] = {'\0'};
while (1)
{
printf("please input msg:\n");
scanf("%s", caMsg);
memcpy(addr, caMsg, strlen(caMsg)+1);
if (0 == strcmp("quit", caMsg))
{
break;
}
}
//解除映射
munmap(addr, 1024);
close(fd);
return 0;
}