mmap无效参数错误

时间:2015-07-16 11:22:39

标签: c linux

这是我第一次使用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 ;
}

3 个答案:

答案 0 :(得分:4)

您需要在标志中指定MAP_PRIVATEMAP_SHARED中的至少一个。另外,正如另一个答案所说,你应该有-1作为可移植性的文件描述符,但这不是你的问题所在(因为你用linux和linux标记了这个问题,忽略了anon映射的文件描述符)。

答案 1 :(得分:1)

您正在传递0作为文件描述符。匿名映射应始终使用-1作为文件描述符,因为它们不受文件支持。另外,正如另一个答案所说,MAP_ANONYMOUS应该由MAP_PRIVATEMAP_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。