mmap文件,其中一个附加页面没有文件支持

时间:2015-02-12 17:51:59

标签: c++ c linux mmap

我需要以只读模式对文件进行mmap,但是在映射的末尾需要一个额外的页面。\ 0-ed out。我最初的想法是创建一个额外的页面并通过写入来声明它。

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。

我的问题是,我可以在不修改实际文件的情况下以某种方式声明文件之后的其他页面吗?

1 个答案:

答案 0 :(得分:0)

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;