使用mmap()而不是malloc()

前端之家收集整理的这篇文章主要介绍了使用mmap()而不是malloc()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试完成一个使用系统调用完成的练习,并且需要为struct *分配内存.我的代码是:
myStruct * entry = (myStruct *)mmap(0,SIZEOF(myStruct),PROT_READ|PROT_WRITE,MAP_ANONYMOUS,-1,0);

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

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

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

PROT_READ | PROT_WRITE部分有问题吗?

解决方法

您需要在标志中指定MAP_PRIVATE.
myStruct * entry = (myStruct *)mmap(0,MAP_PRIVATE|MAP_ANONYMOUS,0);

manual page

The flags argument determines whether updates to the mapping are
visible to other processes mapping the same region,and whether
updates are carried through to the underlying file. This behavior is
determined by including exactly one of the following values in 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),MAP_PRIVATE | MAP_ANONYMOUS,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;
}

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

猜你在找的C&C++相关文章