打印内存地址,映射

时间:2015-10-22 10:20:41

标签: c malloc memory-address memory-mapping

我正试图从命令行获取参数。并打开一个文件进行读/写,然后malloc一个内存来建议函数mmap的起始地址。但它不会打印任何地址(建议的地址和内核地址),即使它正在创建文件。

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

int main(int argc, char **argv){

  if(argc>=3){

    int fd;
    const char *fname=argv[1];
    const char *str=argv[2];


    if((fd=open(fname,O_CREAT|O_RDWR,0))!=-1){

       int *startaddress = malloc(strlen(str)*sizeof(char));
       mmap(startaddress, strlen(str)*sizeof(char), PROT_READ|PROT_WRITE,        MAP_SHARED, fd, 0);

       write(fd,str,strlen(str));

       printf("File address: %d\n",fd);
       printf("Suggested file address: %p", startaddress);
       close(fd);
       free(startaddress);
     }

   }else
   printf("You didn't enter a proper number of arguments.\n");

}

1 个答案:

答案 0 :(得分:0)

默认情况下,mmap将您提供的地址作为提示,并尽可能地将内存映射到最近。要强制mmap完全分配到startaddress,必须提供标记MAP_FIXED。

请注意,该手册不鼓励使用此选项,因为如果此地址已经分配了内存,则可能导致内存损坏,或者只是失败。 此外,如果地址不是getpagesize的倍数,映射将失败。