函数原型:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
作用:将文件映射到以addr为起始地址的进程内存空间,在调用时,通常将addr参数传为NULL,由内核选择起始的虚拟地址空间
对应的munmap(2)系统调用解除映射关系,将内存中的数据写入到文件。可以这样理解,调用munmap之后,mmap返回的指针为野指针了,不能够再访问其指向的空间
在mmap(2)返回之后,可以通过close(fd),关闭打开的文件,之后的操作(在munmap(2)调用之前)均为对内存的操作
程序: 转载自 https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html
#include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> typedef struct{ char name[4]; int age; }people; int main(int argc, char** argv) // map a normal file as shared mem: { int fd,i; people *p_map; char temp; fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC, 0777); lseek(fd,sizeof(people)*5-1,SEEK_SET); write(fd,"",1); //文件大小为 5*sizeof(people) = 40 bytes printf("type people size is %d\n", sizeof(people)); p_map = (people*) mmap( NULL,sizeof(people)*10,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0 ); //映射的内存空间大小为 10*sizeof(people) close( fd ); //在文件映射到内存空间之后可以通过close(2)系统调用关闭文件 temp = 'a'; for(i=0; i<10; i++) { temp += 1; memcpy( ( *(p_map+i) ).name, &temp,1 ); ( *(p_map+i) ).age = 20+i; } printf(" initialize over \n "); sleep(10); munmap( p_map, sizeof(people)*10 ); //在munmap(2)调用之后,内存中的数据写入到文件,注意写入的数据只有 5*sizeof(people) 而不是 10*sizeof(people) printf( "umap ok \n" ); return 0; }
#include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> typedef struct{ char name[4]; int age; }people; int main(int argc, char** argv) // map a normal file as shared mem: { int fd,i; people *p_map; fd=open( argv[1], O_CREAT|O_RDWR, 0777 ); p_map = (people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0); //close(fd); for(i = 0;i<10;i++) { printf( "name: %s age %d;\n",(*(p_map+i)).name, (*(p_map+i)).age ); } munmap( p_map,sizeof(people)*10 );
close(fd); return 0; }