使用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:
您只需要其中一个标志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 = %dn",entry,entry->a); } return 0; } (上面没有MAP_PRIVATE当然是你作为MCVE提供的一个很好的例子.这使得其他人更容易帮助你,因为他们可以准确地看到你做了什么,并测试他们的建议解决方案.你应该总是提供MCVE). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |