mmap地图大小限制

Bus*_*ush 0 c++ mmap memcpy segmentation-fault

可能重复:
在mmap之后的memcpy中获取分段错误SIGSEGV

我在我的cpp代码中使用mmap()来映射一个大的区域(100,000,000字节~100MB).

从man mmap我明白我只能知道它是否成功,我不知道它成功映射了多少大小.

在我的情况下,我可以使用8192字节的缓冲区迭代地读取该区域,但是在读取~24MB后我得到SIGSEGV - 意味着mmap没有成功映射整个区域?

我正在通过memcpy函数读取从映射区域复制到堆上的缓冲区.(当缓冲区在堆栈上时,我也看到相同的行为).

我怎么知道它是否映射了整个区域?如果它映射了整个区域,那么为什么在读取大约24MB的字节后得到SIGSEGV?

谢谢!

Use*_*ess 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;
}
Run Code Online (Sandbox Code Playgroud)

因此,您的终止条件看起来是错误的:您递减 read_length并循环直到它小于 buffer_size.

另外,你addrbuffer_size 整数递增(它是一个int*),而不是字节.所以,你的进步addr速度太快了4倍.

BTW,在其他代码中:lseek接受并返回一个off_t,而不是一个size_t.


编辑:大多数这些错误已经在另一个问题中指出,所以我不确定这个会增加任何东西.