在 OSX 10.12 上使用 mmap() 时出现 'cannot allocate memory' 错误
Get 'cannot allocate memory' error while using mmap() on OSX 10.12
我找到了一些答案,但它们都只适用于 Linux。但是 MacOS 呢?我的代码在 ubuntu 上没问题,所以我不需要粘贴它们。谢谢!
——————————————————————————————————————————
修改并粘贴我的代码。
void unix_error(char* msg)
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
void* Mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset)
{
void* ptr;
if((ptr = mmap(start, length, prot, flags , fd, offset)) == ((void*)-1)){
unix_error("mmap");
}
return ptr;
}
int main
{
char *homepath = getenv("HOME");
char *file = "/Desktop/main.c";
strcat(homepath, file);
printf("%s\n", homepath);
int fd = open_file(homepath);
printf("%d\n", fd);
char *ptr = Mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, 0);
write(1, ptr, filesize);
}
得到错误:
/Users/<username>/Desktop/main.c
3
mmap: Cannot allocate memory
getenv()
函数通常 return 是指向您不能/不应修改的内存的指针。而且它肯定不会 return 一个在末尾有一堆额外的 space 你可以追加到。
所以你的 strcat(homepath, file)
正在践踏它不应该的内存,所以在那之后任何事情都可能发生。它可能(看起来)正常工作,也可能立即或相当长时间后失效,甚至可能将猴子从排气口排出。
我找到了一些答案,但它们都只适用于 Linux。但是 MacOS 呢?我的代码在 ubuntu 上没问题,所以我不需要粘贴它们。谢谢! —————————————————————————————————————————— 修改并粘贴我的代码。
void unix_error(char* msg)
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
void* Mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset)
{
void* ptr;
if((ptr = mmap(start, length, prot, flags , fd, offset)) == ((void*)-1)){
unix_error("mmap");
}
return ptr;
}
int main
{
char *homepath = getenv("HOME");
char *file = "/Desktop/main.c";
strcat(homepath, file);
printf("%s\n", homepath);
int fd = open_file(homepath);
printf("%d\n", fd);
char *ptr = Mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, 0);
write(1, ptr, filesize);
}
得到错误:
/Users/<username>/Desktop/main.c
3
mmap: Cannot allocate memory
getenv()
函数通常 return 是指向您不能/不应修改的内存的指针。而且它肯定不会 return 一个在末尾有一堆额外的 space 你可以追加到。
所以你的 strcat(homepath, file)
正在践踏它不应该的内存,所以在那之后任何事情都可能发生。它可能(看起来)正常工作,也可能立即或相当长时间后失效,甚至可能将猴子从排气口排出。