使用mmap()而不是malloc()

Sea*_*lly 6 c malloc mmap

我正在尝试完成一个使用系统调用完成的练习,并且需要为struct*分配内存.我的代码是:

myStruct * entry = (myStruct *)mmap(0, SIZEOF(myStruct), PROT_READ|PROT_WRITE,
MAP_ANONYMOUS, -1, 0);
Run Code Online (Sandbox Code Playgroud)

澄清一下,我不能使用malloc()但可以使用mmap().我在Netbeans上的Windows上没有遇到任何问题,但是现在我正在编译并在Ubuntu上从命令行运行我每次尝试访问它时都会收到"Segmentation Fault".

有没有理由说它可以在一个而不是另一个上工作,并且是以mmap()这种方式分配内存的有效方法?我担心的是我最初会为每次mmap()调用分配大块内存,现在我无法让它运行.

另外,我的mmap返回的错误是22 - 无效参数(我在编写问题时做了一些故障排除,因此错误检查不在上面的代码中).地址为0,自定义SIZEOF()函数在其他mmap参数中工作,我使用的MAP_ANONYMOUSfdoffset参数必须分别为-1和0.

这些PROT_READ|PROT_WRITE部分有问题吗?

dav*_*mac 6

您需要在标志中指定MAP_PRIVATE.

myStruct * entry = (myStruct *)mmap(0, SIZEOF(myStruct),
        PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
Run Code Online (Sandbox Code Playgroud)

手册页:

flags参数确定映射的更新是否对映射相同区域的其他进程可见,以及是否将更新传递到基础文件.通过在flags中包含以下其中一个值来确定此行为:

您只需要其中一个标志MAP_PRIVATE或MAP_SHARED - 但您没有给出其中任何一个.

一个完整的例子:

#include <sys/mman.h>
#include <stdio.h>

typedef struct
{
    int a;
    int b;
} myStruct;

int main()
{
    myStruct * entry = (myStruct *)mmap(0, sizeof(myStruct),
            PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

    if (entry == MAP_FAILED) {
        printf("Map failed.\n");
    }
    else {
        entry->a = 4;
        printf("Success: entry=%p, entry->a = %d\n", entry, entry->a);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(以上,MAP_PRIVATE当然没有你作为MCVE提供的一个很好的例子.这使得其他人更容易帮助你,因为他们可以准确地看到你做了什么,并测试他们提出的解决方案你应该总是提供MCVE).