当我运行以下代码时出现分段错误...
int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0 );
x[0] = 42; // <--- Segmentation fault happens due to this
这里有什么问题?
答案 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,或者因为交换空间已满)。