我正在尝试完成一个使用系统调用完成的练习,并且需要为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, SIZEOF(myStruct),
        PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
从手册页:
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;
}
(以上,MAP_PRIVATE当然没有你作为MCVE提供的一个很好的例子.这使得其他人更容易帮助你,因为他们可以准确地看到你做了什么,并测试他们提出的解决方案你应该总是提供MCVE).