mmap内存映射。
写:注意write(fd,"",1);//这步必须,如果打开一个空文当,操作 (*(p_map+i)).数据时将会出bus error错误
/*-------------map_normalfile1.c-----------*/
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>
typedef struct
{
char name[4];
int age;
}people;
main(int argc,char **argv)//argv 运行时提供文档路径。这里写入数据
{
int fd,i;
people *p_map;
char temp;
fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
//lseek(fd,4096/*sizeof(people)*5-1*/,SEEK_SET);//4096参数需要是pagesize的倍数,并且需要对该位置输入值。
//write(fd,"",1);
//p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,4096);
write(fd,"",1);//这步必须,如果打开一个空文当,操作 (*(p_map+i)).数据时将会出bus error错误
//NULL系统分配,映射大小,可读写,共享,文件描述符,文件偏移地址。
p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
if(p_map == MAP_FAILED)
{
printf("mmap create failed!\n");
return;
}
printf("mmap create succed! memery add=%p\n", p_map);
temp='a';
for(i=0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
printf("initializeover\n");
sleep(10);
munmap(p_map,sizeof(people)*10);
printf("umapok\n");
}
读。读之前先写,否则错误。write(fd,"",1);//这步必须,如果打开一个空文当,操作 (*(p_map+i)).数据时将会出bus error错误
/*-------------map_normalfile2.c-----------*/
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
typedef struct
{
char name[4];
int age;
}people;
main(int argc,char **argv)//mapanormalfileassharedmem: 
{
int fd,i;
people *p_map;
char *a;
fd=open(argv[1],O_CREAT|O_RDWR,00777);
//write(fd,"",1);
p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(p_map == MAP_FAILED)
{
printf("mmap create failed!\n");
return;
}
printf("mmap create succed! memery add=%p\n", p_map);
for(i=0;i<10;i++)
{
printf("name:%s,age=%d;\n",(*(p_map+i)).name,(*(p_map+i)).age);
//memcpy((*(p_map+i)).name,"abc",3);
//(*(p_map+i)).age=11;
}
munmap(p_map,sizeof(people)*10);
}
编译成执行文件:map_normalfile1,map_normalfile2
./map_normalfile1 mmapfile.txt
./map_normalfile2 mmapfile.txt