在mmap期间用于memcpy重叠的Segfault

时间:2011-09-08 08:20:53

标签: c

我遇到了一个我似乎无法解决的mmap问题。这是设置:我用malloc将一个巨大的多维数组分配到内存中,我用我的值填充它,然后我想将它保存在一个文件中。该数组包含3200000000个字节。该机器是64位的,并且有足够的内存来执行此操作。

Linux 2.6.32-27-server #49-Ubuntu SMP Thu Dec 2 02:05:21 UTC 2010 x86_64 GNU/Linux

使用mmap创建文件很好,我得到了ptrFile指针。 当我将数组存入ptrFile指针时,程序会因为段错而崩溃。

经过几次调试后,我看到两个缓冲区重叠。数据数组从地址0x7FEC47FFF010开始,mmap返回的指针是0x7FEA2543E000。我试过memmove来解决这个问题,但结果是一样的。如果我将复制到文件的大小限制为1000字节,它就可以正常工作。

为什么两个分配的指针重叠?

非常感谢!

- J

3 个答案:

答案 0 :(得分:2)

那些内存区域重叠(只要您的mmap块的大小与您说的大小相同)。 0x7FEC47FFF010 - 0x7FEA2543E000 = 9,172,684,816,远远大于您提到的3,200,000,000的大小。

答案 1 :(得分:2)

mmap()无法扩展文件。在复制数据之前,首先必须使用例如ftruncate将文件放大到适当的大小。虽然使用mmap只是将数据复制到文件是过度的,但只需使用write(2)即可。

答案 2 :(得分:1)

你真的需要mmap吗?如果你想做的唯一事情是保存你的记忆块,那么malloc区域的简单writefwrite就足够了。您只需要确保它们处理64位大小。