我尝试使用以下代码在 iOS 设备上使用 mmap
struct stat s;
int status;
size_t size;
int fd;
fd = open ([dataFile cStringUsingEncoding:NSUTF8StringEncoding], O_RDONLY);
fcntl( fd, F_NOCACHE );
status = fstat (fd, & s);
if (status < 0)
{
// error handling
}
size = s.st_size;
FuncFileLog(@"%@", @"before read");
off_t offset = 0;
char* data = (char *) mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset);
char *pch;
int lastPosInString = 0;
pch=strchr(data,'\n');
long lineCounter = 0;
while (pch != NULL)
{
size_t lineLength = 0;
int posInString = pch - data + 1;
lineLength = posInString - lastPosInString;
char *out = calloc(lineLength, sizeof(char));
memcpy(out, data + lastPosInString, lineLength);
out[lineLength - 1] = '\0';
if (lineCounter > 0)
{
// do something
}
lastPosInString = posInString;
pch=strchr(pch+1,'\n');
lineCounter = lineCounter + 1;
}
munmap((void *)data, size);
close(fd);
它可以工作,但有时当我读取大约 3.5 mb 的文件时,我会无缘无故地得到一个 EXC_BAD_ACCESS,因为我0xffffffff
认为来自 mmap 的数据指针是一个错误。而且它似乎只发生在模拟器中。
我
errno:12 Cannot allocate memory
目前只能在模拟器中使用保护 malloc、保护边缘、涂鸦和僵尸