标签:cfile ima 空间 访问 sage har map rdo 情况
存储映射是一个磁盘文件与存储空间的一个缓存相映射,对缓存数据的读写就相应的完成了文件的读写。
文件操作部分映射到虚拟内存的一块区域,我们对虚拟内存映射的那块区域进行读写操作,读写之后,那块区域自动同步到文件当中。
4G空间分布:
共享内存映射区就是文件映射到的内存区。
1 #include <unistd.h> 2 #include <sys/mman.h> 3 //mmap(建立内存映射) 4 void *mmap(void *start, size_t length, int prot, int flags, int fd,off_t offsize);
1 #include <unistd.h> 2 #include <sys/mman.h> 3 //munmap(解除内存映射) 4 int munmap(void *start,size_t length);
(1)写字符
通过存储映射向文件中写入若干个字符。(文件中必须开辟空间供存储映射区同步,就相当于在写入的区域做一块空洞文件,然后将空洞文件映射到存储映射区)
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <fcntl.h> 4 #include <unistd.h> 5 #include <string.h> 6 #include <errno.h> 7 #include <stdlib.h> 8 #include <stdio.h> 9 #include <fcntl.h> 10 #include <sys/mman.h> 11 12 int main(int argc, const char *argv[]) 13 { 14 if(argc < 2) { 15 printf("usage: %s file\n", argv[0]); 16 exit(1); 17 } 18 19 int fd = open(argv[1], O_RDWR); 20 if(fd < 0){ 21 perror("open error"); 22 exit(1); 23 } 24 25 26 //在19个字节处写入一个0 27 lseek(fd, 19, SEEK_END); 28 write(fd, "0", 1); 29 30 char *addr; 31 //进行存储映射 32 addr = mmap(0, 20, PROT_WRITE, MAP_SHARED, fd, 0); 33 if(addr < 0) { 34 perror("mmap error"); 35 exit(1); 36 } 37 38 //修改存储映射区的内容 39 int i; 40 for(i = 0; i < 20; i++) 41 { 42 *(addr + i) = ‘A‘ + i; 43 } 44 printf("write success\n"); 45 46 //解除映射 47 munmap(addr, 0); 48 49 close(fd); 50 51 return 0; 52 }
程序运行结果:
(2)文件的拷贝
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <fcntl.h> 4 #include <unistd.h> 5 #include <string.h> 6 #include <errno.h> 7 #include <stdlib.h> 8 #include <stdio.h> 9 #include <fcntl.h> 10 #include <sys/mman.h> 11 12 int main(int argc, const char *argv[]) 13 { 14 if(argc < 3) { 15 printf("usage: %s srcfile destfile\n", argv[0]); 16 exit(1); 17 } 18 19 int src_fd; 20 int dest_fd; 21 22 if((src_fd = open(argv[1], O_RDONLY)) < 0) { 23 perror("open error"); 24 exit(1); 25 } 26 27 if((dest_fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0777)) < 0) { 28 perror("open error"); 29 exit(1); 30 } 31 32 // 定位到文件尾部,返回一个偏移量,反应文件长度 33 long len = lseek(src_fd, 0, SEEK_END); 34 printf("len: %ld\n", len); 35 36 // 在文件开始处跳过 len-1 个字节 37 lseek(dest_fd, len-1, SEEK_SET); 38 write(dest_fd, "0", 1); //创建了目标文件的空洞文件 39 40 char *src_map = mmap(0, len, PROT_READ, MAP_SHARED, src_fd, 0); 41 if(src_map < 0) { 42 perror("mmap error"); 43 exit(1); 44 } 45 46 char *dest_map = mmap(0, len, PROT_WRITE, MAP_SHARED, dest_fd, 0); 47 if(dest_map < 0) { 48 perror("mmap error"); 49 exit(1); 50 } 51 52 //存储映射区的复制并同步到文件中 53 memcpy(dest_map, src_map, len); 54 munmap(src_map, 0); 55 munmap(dest_map, 0); 56 57 close(src_fd); 58 close(dest_fd); 59 60 return 0; 61 }
运行结果:
标签:cfile ima 空间 访问 sage har map rdo 情况
原文地址:https://www.cnblogs.com/kele-dad/p/9048712.html