可能重复:
Getting segmentation fault SIGSEGV in memcpy after mmap
我在我的cpp代码中使用mmap()来映射一个大的区域(100,000,000字节~100MB)。
从man mmap我明白我只能知道它是否成功,我不知道它成功绘制了多少大小。
在我的情况下,我可以使用8192字节的缓冲区迭代地读取该区域,但是在读取~24MB后我得到SIGSEGV - 意味着mmap没有成功映射整个区域? / p>
我正在通过memcpy函数读取从映射区域复制到堆上的缓冲区。 (当缓冲区在堆栈上时,我也看到相同的行为。)
我怎么知道它是否映射了整个区域?如果它映射了整个区域,那么为什么在读取大约24MB的字节后得到SIGSEGV?
谢谢!
答案 0 :(得分:6)
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
并循环直到它小于 buffer_size
。
此外,您将addr
增加buffer_size
整数(它是int*
),不是字节。所以,你要快{4}推进addr
。
BTW,在其他代码中:lseek
接受并返回off_t
,而不是size_t
。
编辑:其中大部分错误已在其他问题中指出,所以我不确定这个会增加任何内容。
答案 1 :(得分:2)
如果您遇到分段违规,那不是因为mmap
没有成功,而是因为其他原因。您正尝试访问映射到进程虚拟内存的任何区域之外的段。
根据程序分配的地图集检查程序的内存访问。请考虑利用pmap
,strace
和gdb
。