Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7723798
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: LINUX

2011-06-12 18:49:28

内存映射函数提供了把文件内容映射到用户程序空间的方法。

#include

void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

int munmap(void *start, size_t length); //取消映射

start: 指定映射地址,一般为NULL,表示由mmap自定地址,映射成功后该地址会返回。

length: 映射的文件内容长度。

prot: 指定内存块的保护状态(如下,可组合使用)

PROT_EXEC  区域可执行

PROT_READ   区域可读

PROT_WRITE   区域可写

flags: 映射对象的类型(MAP_PRIVATE MAP_SHARED必须指定一个)

MAP_FIXED start地址不能用于映射,则调用失败,不建议用

MAP_SHARED 与其它进程共享该映射

MAP_PRIVATE 创建一个私有的“写入时复制(copy on write)”的映射,对映射区域所作的任何修改都不会写回原文件

MAP_ANONYMOUSMAP_ANON 建立匿名映射,此时忽略fd,不涉及文件由系统创建映射,区域初始化为0,一般用于某些系统扩展堆用,也可用于多任务将共享数据而不创建文件。

fd: 文件描述符,表示欲映射到内存的文件。

offset: 文件映射的偏移量,通常为0,表示从文件头开始映射。

返回:出错返回-1,成功返回映射地址。

 

  1. /*
  2.  *    mmap内存映射
  3.  *    写入10个数据至文件映射至内在中进行排序保存数据至文件
  4.  *    Lzy    2011-6-12
  5.  */

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <fcntl.h>
  9. #include <errno.h>
  10. #include <sys/mman.h>

  11. int main(void)
  12. {
  13.     int i, j, num, lenth;
  14.     int *p;
  15.     int fd;                //定义文件描述符
  16.     
  17.     
  18.     fd = open("test", O_RDWR | O_CREAT, 00766);    //创建、打开文件,以读写方式
  19.     if(fd < 0)
  20.     {
  21.         perror("open faile");
  22.         exit(0);
  23.     }
  24.     
  25.     for(i = 0; i < 10; i++)
  26.     {
  27.         printf("%d ",num = (rand() % 100));    //取一百以内的随机数
  28.         write(fd, &num, sizeof(int));        //写入文件        
  29.     }
  30.     printf("\n");
  31.     
  32.     lenth = lseek(fd, 0, SEEK_END);        //娶文件长度
  33.     
  34.     p = mmap(NULL, lenth, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);    //内存映射
  35.     if((int)p == -1)
  36.     {
  37.         perror("mmap fail");
  38.         exit(0);
  39.     }
  40.     
  41.     for(i = 0; i < 9; i++)            //排序
  42.     {
  43.         for(j = i+1; j < 10; j++)
  44.         {
  45.             if(p[i] > p[j])
  46.             {
  47.                 num = p[i];
  48.                 p[i] = p[j];
  49.                 p[j] = num;
  50.             }
  51.         }
  52.     }
  53.     
  54.     munmap(p, lenth);        //取消映射
  55.     lseek(fd, 0, SEEK_SET);    //读写指针指向文件头
  56.     
  57.     for(i = 0; i < 10; i++)
  58.     {
  59.         read(fd, &num, sizeof(int));        //读文件    
  60.         printf("%d ",num);                
  61.     }
  62.     printf("\n");

  63.     return 0;
  64. }

 

锁定和解锁内存

内存锁定函数允许进程锁定它的一些或全部内存,要求它们不被交换出内存,以提供应用程序的性能,因为系统繁忙时这可避免频繁分页交换。

#include

int mlock(const void *addr, size_t len);

int munlock(const void *addr, size_t len);

int mlockall(int flags);

int munlockall(void);

addr, len须在页边界上,addr指明将要锁定的内存页面,len确定锁定区域的大小(即一次调用锁定一个或多个页面),返回0表示成功锁定,munlock解锁锁定的内存页以便其能重新可进行交换。

 

mlockall锁定进程的整个存储空间(代码,数据,栈,共享库,共享内存,共享映射内存),参数flags可取MCL_CURRENT表示当前虚拟地址空间,MCL_FUTURE将来调入的虚拟内存空间也将被锁定。

munlockall全部解锁。

注:子进程不能继承父进程的锁定特性。

 

  1. /*
  2.  *    锁定和解锁内存
  3.  *    Lzy    2011-6-12
  4.  */

  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/mman.h>

  8. char str[4096];

  9. int main(void)
  10. {
  11.     int ret;
  12.     
  13.     ret = mlock(str,1024);            //锁定内存
  14.     printf("mlock ret = %d\n",ret);    //返回0表示成功
  15.     
  16.     ret = munlock(str, 1024);            //解锁内存
  17.     printf("munlock ret = %d\n",ret);    //返回0表示成功
  18.     
  19.     return 0;
  20. }
阅读(1562) | 评论(0) | 转发(3) |
0

上一篇:命令解析

下一篇:时间编程

给主人留下些什么吧!~~