为什么mmap不能在这里工作

时间:2011-12-12 13:36:23

标签: c linux memory-management x86-64 mmap

当我运行以下代码时出现分段错误...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0 );

x[0] = 42; // <--- Segmentation fault happens due to this

这里有什么问题?

4 个答案:

答案 0 :(得分:9)

您已指定了错误的标志和文件描述符。它看起来像你想要的是一个匿名(没有文件支持)映射。如果是这种情况,正确的呼叫将是:

x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

您需要使用MAP_ANONYMOUS标志告诉Linux没有文件。你应该传递-1作为文件描述符,而不是0。

答案 1 :(得分:1)

好的,我明白了。我忘了放 MAP_ANONYMOUS ,所以应该是这样的......

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 
  0, 0 );

以这种方式工作。

答案 2 :(得分:1)

man mmap说:

On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately

检查是否x == MAP_FAILED。可能是这种情况。

答案 3 :(得分:0)

您应该始终检查mmap的结果是否MAP_FAILED(即(void *) -1)并使用errno来获取错误代码。

您的mmap可能会失败(例如,由于资源限制设置为setrlimit,或者因为交换空间已满)。