zoukankan      html  css  js  c++  java
  • linux mmap系统调用

    函数原型:

    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
    ", 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 
     ");
      sleep(10);
      munmap( p_map, sizeof(people)*10 );  //在munmap(2)调用之后,内存中的数据写入到文件,注意写入的数据只有 5*sizeof(people) 而不是 10*sizeof(people)
      printf( "umap ok 
    " );
      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;
    ",(*(p_map+i)).name, (*(p_map+i)).age );
      }
      munmap( p_map,sizeof(people)*10 );
    close(fd);
    return 0; }
  • 相关阅读:
    软件/环境的注册码
    js图片延迟加载如何实现
    http状态码
    关于深拷贝(含数组对象)
    javascript继承方式详解
    使用寄生构造函数 创建类
    前端知识点大全【转载】
    统一addEventListener与attachEvent中this指向问题
    sublime text全程指南【转载】
    函数防抖与节流[转载]
  • 原文地址:https://www.cnblogs.com/rocklee25/p/7392285.html
Copyright © 2011-2022 走看看