加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:存储映射I/O(mmap函数)

发布时间:2016-10-12 20:17:52 所属栏目:Unix 来源:网络整理
导读:共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在

四、对mmap地址的访问

#include <sys/mman.h>  
void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);  
int munmap(void *start, size_t length);

mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。

mmap()必须以PAGE_SIZE()为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

内存映射一个普通文件时,内存中映射区的大小(mmap的第二个参数)通常等于该文件的大小,然而文件的大小和内存的映射区大小可以不同。

我们要展示的第一种情形的前提是:文件大小等于内存映射区大小,但这个大小不是页面大小的倍数。

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <sys/types.h>  
#include <unistd.h>  
#include <sys/mman.h>  
#define max(A,B) (((A)>(B))?(A):(B))  
      
int main(int argc,char ** argv)  
{  
  int fd,i;  
  char *ptr;  
  size_t filesize,mmapsize,pagesize;  
      
  if(argc != 4)  
    printf("usage:tes1 <pathname> <filesname> <mmapsize>n");  
  filesize = atoi(argv[2]);  
  mmapsize = atoi(argv[3]);  
      
 /*open file:create or truncate;set file size*/
  fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0777);  
  lseek(fd,filesize-1,SEEK_SET);  
  write(fd," ",1);  
  ptr = mmap(NULL,mmapsize,PROT_READ |PROT_WRITE,MAP_SHARED,fd,0);  
  close(fd);  
      
  pagesize = sysconf(_SC_PAGESIZE);  
  printf("PAGESIZE = %ldn",(long)pagesize);  
      
  for(i = 0;i < max(filesize,mmapsize); i += pagesize)  
  {  
    printf("ptr[%d] = %dn",i,ptr[i]);  
    ptr[i] = 1;  
    printf("ptr[%d] = %dn",i + pagesize - 1,ptr[i + pagesize - 1]);  
    ptr[i + pagesize - 1] = 1;  
  }  
  printf("ptr[%d] = %dn",i,ptr[i]);  
  exit(0);  
}

命令行参数

16-19   命令行参数有三个,分别指定即将创建并映射到内存的文件的路径名,该文件将被设置成的大小以及内存映射区得大小。

创建,打开并截断文件;设置文件大小

22-24   待打开的文件若不存在则创建之,若已存在则把它的大小截短成0.接着把该文件的大小设置成由命令行参数指定的大小,办法是把文件读写指针移动到这个大小减去1的字节位置,然后写1个字节。

内存映射文件

25-26   使用作为最后一个命令行参数指定的大小对该文件进行内存映射。其描述符随后被关闭。

输出页面大小

28-29   使用sysconf获取系统实现的页面大小并将其输出。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读