我正在尝试完成一个使用系统调用完成的练习,并且需要为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_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);
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).