加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

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

发布时间:2016-09-27 12:24:40 所属栏目:Unix 来源:站长网
导读:副标题#e# 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共

当文件长度为5000字节,映射1000字节时,但是1000字节不是PAGE_SIZE(4096)的整数倍,这样会强制映射为PAGE_SIZE的整数倍,现在映射的是4096字节。所以对映射区里面的第4096字节进行修改为1,会同步到文件中。

下面的程序展示了处理一个持续增长的文件的一种常用技巧:指定一个大于该文件大小的内存映射区大小,跟踪该文件的当前大小(以确保不访问当前文件尾以远的部分),然后就让该文件的大小随着往其中每次写入数据而增长。

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <sys/mman.h>  
#include <unistd.h>  
#include <sys/types.h>  
#define FILE "test.data"  
#define SIZE 32768  
int main(int argc,char **argv)  
{  
  int fd,i;  
  char *ptr;  
      
  /*open:create or truncate;then mmap file */
  fd = open(FILE,O_RDWR | O_CREAT | O_TRUNC,0777);  
  ptr = mmap(NULL,SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);  
      
  for(i = 4096;i <= SIZE;i += 4096)  
  {  
   printf("setting file size to %dn",i);  
   ftruncate(fd,i);  
   printf("ptr[%d] = %dn",i-1,ptr[i-1]);  
  }  
  exit(0);  
}

打开文件

15-17  打开一个文件,若不存在则创建之,若已存在则把它截短成大小为0.以32768字节的大小对该文件进行内存映射,尽管它当前的大小为0.

增长文件大小

19-24  通过调用ftruncate函数把文件的大小每次增长4096字节,然后取出现在是该文件最后一个字节的那个字节。

现在运行这个持续,我们看到随着文件的大小的增长,我们能通过所建立的内存映射区访问新的数据。

huangcheng@ubuntu:~$ ls -l test.data  
ls: 无法访问test.data: 没有那个文件或目录  
huangcheng@ubuntu:~$ ./a.out
setting file size to 4096  
ptr[4095] = 0  
setting file size to 8192  
ptr[8191] = 0  
setting file size to 12288  
ptr[12287] = 0  
setting file size to 16384  
ptr[16383] = 0  
setting file size to 20480  
ptr[20479] = 0  
setting file size to 24576  
ptr[24575] = 0  
setting file size to 28672  
ptr[28671] = 0  
setting file size to 32768  
ptr[32767] = 0  
huangcheng@ubuntu:~$ ls -l test.data  
-rwxr-xr-x 1 huangcheng huangcheng 32768 2013-07-09 16:47 test.data

本例子表明,内核跟踪着被内存映射的底层支撑对象(本例子中为文件test.data)的大小,而且我们总是能访问在当前文件大小以内又在内存映射区以内的那些字节。

(编辑:应用网_丽江站长网)

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

推荐文章
    热点阅读