繁体   English   中英

为什么mmap在这里不起作用

[英]Why is mmap not working here

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

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

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

怎么了

您指定了不正确的标志和文件描述符。 看起来您想要的是匿名(没有文件支持)映射。 如果是这样,正确的调用将是:

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

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

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

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

它以这种方式工作。

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是否x == MAP_FAILED 可能是这种情况。

而且,您应始终检查mmap的结果是否不是MAP_FAILED (即(void *) -1 ),并在这种情况下使用errno获取错误代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM