MMAP地图尺寸限制
mmap map size limit
可能的重复:
在mmap之后,在memcpy中获取分割故障
我正在使用CPP代码中的MMAP()来映射大尺寸区域(100,000,000字节〜100MB)。
从man mmap中,我知道我只知道它是否成功,我不知道它成功地映射了多少尺寸。
就我而言,我可以用8192字节的缓冲区迭代地读取该区域,但是在阅读〜24MB后,我会得到Sigsegv-表示MMAP并未成功地映射整个区域吗?<<<<<</p>
我正在阅读一个memcpy功能,以从映射区域复制到堆上的缓冲区。(当缓冲区在堆上时,我也看到相同的行为)。
我怎么知道它是否映射了整个区域?如果它映射了整个区域,那么为什么在读取大约24mb的字节后我要获得sigsegv?
谢谢!
int * addr = reinterpret_cast<int *>(mmap(NULL, length , PROT_READ, flags , fd, 0));
// ...
int * initaddr = addr;
char buffer[jbuffer_size];
void *ret_val = buffer;
int read_length = length;
while(ret_val == buffer || read_length<jbuffer_size) {
ret_val = memcpy(buffer, addr,jbuffer_size);
addr+=jbuffer_size;
read_length -= jbuffer_size;
}
因此,您的终止状况看起来不错:您降低 read_length
and循环,直到小于 buffer_size
。
另外,您正在通过buffer_size
Integers 递增addr
(这是int*
),不是 bytes。因此,您正在前进addr
4次太快。
btw,在其他代码中: lseek
拿来并返回 off_t
,而不是 size_t
。
编辑:这些错误中的大多数已经在另一个问题中指出,所以我不确定这会添加任何内容。
如果违反细分,这并不是因为mmap
没有成功,而是因为其他事情。您正在尝试访问映射到过程的"虚拟内存"的任何区域之外的细分市场。
根据您的程序分配的一组地图,检查程序的内存访问。考虑利用pmap
,strace
和gdb
。
相关文章:
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 如何将PERF_AMPLE_READ与mmap一起使用
- 在C++中将矢量转换为嵌套地图
- 从结构寻址时,MMAP变量的行为很奇怪
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 修改地图内矢量中的值
- MMAP地图尺寸限制