【发布时间】:2015-10-22 10:20:40
【问题描述】:
我正在尝试从命令行获取参数。并打开一个文件进行读/写,然后 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");
}
【问题讨论】:
-
如果它没有打印任何消息,请尝试添加
\n(例如printf("Suggested file address: %p\n", startaddress);或在打印后添加fflush(stdout);。否则,请检查startaddress != NULL。(ps:你应该得到输出mmap()的其他指针——给mmap()一个地址只是hint) -
@865719 现在我得到了一个输出。为什么 mmap 不使用我给它的内存?
-
作为mentioned in the manual,它是提示:"如果addr 不为NULL,那么内核会将其作为提示放置映射;在 Linux 上,将在附近的页面边界处创建映射。新映射的地址作为调用的结果返回。"
-
换句话说:你提供的地址是一个已经
malloc()ated空间的开始,mmap()不能只是“使用它”。但是,mmap()将尝试将数据映射到尽可能接近您提供的地址的内存块。 -
首先,您对
mmap()的回复是什么?其次,在堆中给mmap()一个地址,例如从malloc()返回的地址是破坏堆的好方法——如果在该地址映射成功,它将导致实际的堆页面从进程地址取消映射空间。
标签: c malloc memory-address memory-mapping