Bus*_*ush 0 c++ mmap memcpy segmentation-fault
我在我的cpp代码中使用mmap()来映射一个大的区域(100,000,000字节~100MB).
从man mmap我明白我只能知道它是否成功,我不知道它成功映射了多少大小.
在我的情况下,我可以使用8192字节的缓冲区迭代地读取该区域,但是在读取~24MB后我得到SIGSEGV - 意味着mmap没有成功映射整个区域?
我正在通过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;
}
Run Code Online (Sandbox Code Playgroud)
因此,您的终止条件看起来是错误的:您递减 read_length并循环直到它小于 buffer_size.
另外,你addr用buffer_size 整数递增(它是一个int*),而不是字节.所以,你的进步addr速度太快了4倍.
BTW,在其他代码中:lseek接受并返回一个off_t,而不是一个size_t.
编辑:大多数这些错误已经在另一个问题中指出,所以我不确定这个会增加任何东西.
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |