Questions tagged «mmap»

6
什么时候应该使用mmap进行文件访问?
POSIX环境至少提供两种访问文件的方式。有标准的系统调用open(),read(),write(),和朋友,但也有使用的选项mmap(),将文件映射到虚拟内存。 什么时候比另一种更好?包括两个接口,它们各自的优点是什么?
276 c  file-io  posix  mmap 

12
mmap()与阅读块
我正在开发一个程序,该程序将处理大小可能为100GB或更大的文件。这些文件包含可变长度记录集。我已经启动并运行了第一个实现,现在正寻求提高性能,尤其是由于输入文件被扫描了多次,因此更有效地执行I / O。 是否有mmap()通过C ++ fstream库读取和使用块的经验法则?我想做的是从磁盘将大块读取到缓冲区中,从缓冲区中处理完整的记录,然后再读取更多内容。 该mmap()代码可能会得到非常混乱,因为mmap“d块需要躺在页大小的边界(我的理解)和记录可能潜在般划过页面边界。使用fstreams时,由于我们不限于读取位于页面大小边界上的块,因此我只能寻求记录的开头并再次开始读取。 我如何在这两个选项之间做出选择,而无需先实际编写完整的实现?有任何经验法则(例如mmap()快2倍)还是简单测试?
184 c++  file-io  fstream  mmap 

2
当项目中包含程序集文件时,mmap产生了意外的执行权限
我用这个把我的头撞到墙上。 在我的项目中,当我使用mmap映射(/proc/self/maps)分配内存时,尽管我只请求了可读内存,但它仍是一个可读且可执行的区域。 在研究了strace(看起来不错)和其他调试之后,我能够确定似乎唯一可以避免这个奇怪问题的东西:从项目中删除程序集文件,只保留纯C。(什么?!) 因此,这是我一个奇怪的示例,我正在使用Ubunbtu 19.04和默认gcc。 如果使用ASM文件(为空)编译目标可执行文件,则将mmap返回一个可读和可执行区域,如果不进行编译则其行为正确。请参阅/proc/self/maps示例中已嵌入的输出。 example.c #include <stdio.h> #include <string.h> #include <sys/mman.h> int main() { void* p; p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0); { FILE *f; char line[512], s_search[17]; snprintf(s_search,16,"%lx",(long)p); f = fopen("/proc/self/maps","r"); while (fgets(line,512,f)) { if (strstr(line,s_search)) fputs(line,stderr); } fclose(f); } return 0; } example.s:是一个空文件! 产出 附带ASM版本 VirtualBox:~/mechanics/build$ gcc example.c …
94 c  linux  assembly  mmap 

3
Mmap()整个大文件
我试图使用以下代码(test.c)“映射”一个二进制文件(〜8Gb)。 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { const char *memblock; int fd; struct stat sb; fd = open(argv[1], O_RDONLY); fstat(fd, &sb); printf("Size: %lu\n", (uint64_t)sb.st_size); memblock = …
69 c  mmap 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.