c++ - mmap 文件,其中包含一个不受该文件支持的额外页面

标签 c++ c linux mmap

我需要以只读模式映射一个文件,但需要在映射末尾添加一个页面,该页面是\0-ed。我最初的想法是映射一个额外的页面并通过写入声明它。

int file=::open(name,O_RDONLY);
size_t size=lseek(file,0,SEEK_END);
size_t pageSize=::sysconf( _SC_PAGESIZE);
int padding=size%pageSize;
size_t mapSize=size+padding+pageSize;
void* mapping=mmap(0,mapSize,PROT_READ|PROT_WRITE,MAP_PRIVATE,file,0);
*(static_cast<char*>(mapping)+size+padding+1)=0;

但是,如 mmap 文档中所述,当我写入附加页面(以及从那里读取时)时,我会收到 SIGBUS。

我的问题是,我能否在不修改实际文件的情况下以某种方式在文件后声明一个额外的页面?

最佳答案

Linux 支持强制 mmap() 段放置的 MAP_FIXED 标志,因此您所需要做的就是正确计算地址调用第二个 mmap() 将映射匿名页面(当前您对 padding 的计算不正确)。

int file = ::open("mmap", O_RDONLY);
size_t size = ::lseek(file, 0, SEEK_END);
size_t pageSize = ::sysconf(_SC_PAGESIZE);

int padding = pageSize - size % pageSize;
size_t mapSize = size + padding;

void* mapping = ::mmap(0, mapSize, PROT_READ | PROT_WRITE, 
                     MAP_PRIVATE, file, 0);
void* lastPage = static_cast<char*>(mapping) + mapSize;

void* mapping2 = ::mmap(lastPage, pageSize, PROT_READ | PROT_WRITE, 
                        MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);

* static_cast<char*>(mapping ) = 1;
* static_cast<char*>(mapping2) = 1;

关于c++ - mmap 文件,其中包含一个不受该文件支持的额外页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28484401/

相关文章:

c++ - 在单个生产者和多个消费者中无锁地交换缓冲区

c++ - 输入 getline 结束

c - C 类型之间的区别 int32_t int_least32_t 等

找不到段错误的位置

linux - kernel.h中的这段代码是什么意思?

linux - 为什么 Ubuntu 终端在运行负载测试时会关闭?

linux - 如何开始在 *nix 上开发

c++ - 我如何使用 main 函数和来自 getData 函数的用户输入将值初始化为 int 变量?

c - 在 c 中确定运行时的精度

c++ - 如何通过STL容器和算法库计算两个 vector 的内积?