这是我第一次使用mmap系统调用。我得到无效的参数错误,我不明白为什么,显然我错过了一些东西 请帮帮我,谢谢
#include <stdio.h>
#include <sys/mman.h>
int main() {
long pageSize = getpagesize () ;
size_t length = 4096 ;
int * map = (int * ) mmap ( 0 , length , PROT_READ | PROT_WRITE , MAP_ANONYMOUS , 0 , 0 ) ;
if ( map == MAP_FAILED ) {
perror ( " error mapping " ) ;
}
return 0 ;
}
答案 0 :(得分:4)
您需要在标志中指定MAP_PRIVATE
或MAP_SHARED
中的至少一个。另外,正如另一个答案所说,你应该有-1作为可移植性的文件描述符,但这不是你的问题所在(因为你用linux和linux标记了这个问题,忽略了anon映射的文件描述符)。
答案 1 :(得分:1)
您正在传递0
作为文件描述符。匿名映射应始终使用-1
作为文件描述符,因为它们不受文件支持。另外,正如另一个答案所说,MAP_ANONYMOUS
应该由MAP_PRIVATE
或MAP_SHARED
补充。
调用它的正确方法是:
int *map = mmap(0, length, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
请注意,由于mmap
返回void *
,因此无需投射。
答案 2 :(得分:1)
您已指定了错误的标志和文件描述符。您想要的是匿名(不受文件支持)映射。如果是这样的话,正确的呼叫将是:
int *map = mmap(0, length, PROT_READ|PROT_WRITE, MAP PRIVATE|MAP_ANONYMOUS, -1, 0);
MAP_ANONYMOUS标志告诉Linux没有文件。你应该为文件描述符传递-1,而不是0。