可能的重复:
在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
。