UNIX环境高级编程:存储映射I/O(mmap函数)
当文件长度为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)的大小,而且我们总是能访问在当前文件大小以内又在内存映射区以内的那些字节。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |