[英]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.