2012-02-02 21 views
-1

我想找到一个数组的内存映射或从malloc()使用mmap()分配的一些内存,但它显示无效的参数。mmap()的数组或malloced内存

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

int main() 
{ 
     int *var1=NULL; 
     size_t size=0; 

     size = 1000*sizeof(int); 

     var1 = (int*)malloc(size); 



     int i=0; 

     for(i=0;i<999;i++) 
     { 
       var1[i] = 1; 
     } 


     printf("%p\n",var1); 
     void *addr=NULL; 

     addr = mmap((void *)var1, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);   //to create memory map of var1 

     err(1,NULL); //to print error 

     return 0; 
} 

错误:

a.out: Invalid argument 

请帮助我。

预先感谢您。

回答

2

近因mmap失败,因为你问它确实创造了一个新的内存映射,你问的映射被放置在一个特定的地址(var1的地址),该地址已经被占用(由堆其中malloc获取了它的内存),并且您告诉操作系统,如果var1不是合适的地址(MAP_FIXED),则不允许选择备用地址。

分析:你想在这里做什么? “找到数组的内存映射”是什么意思?您是否希望将整数数组放在堆内存中(由malloc()返回)或由mmap()创建的匿名内存映射?顺便说一句,除非你fork()(创建一个子进程),几乎没有功能差异:两者都是你的进程私有的内存区域。但它们不是一回事,你不能用mmap()操纵堆,你也不能用malloc()管理映射的内存。

+0

实际上,我想进一步使用madivse()中的映射将内存标记为可合并。 所以,如果你可以帮助我使用madvise()将一些malloced内存标记为可合并的。 请帮帮我。 – pratick 2012-02-04 15:48:59

+0

阅读'madvise'手册页。它说“KSM只合并私人匿名页面(参见'mmap(2)')”。你从'malloc'获得了你的内存块。这不是一个私人的匿名页面。它不符合使用'madvise(MAD​​V_MERGEABLE)'的要求。故事结局。 – Celada 2012-02-04 20:56:42