函数原型:

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; }