2

我尝试使用以下代码在 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、保护边缘、涂鸦和僵尸

4

1 回答 1

2

我建议阅读手册页mmap(打开 Terminal.app 并输入man mmap

RETURN VALUES
     Upon successful completion, mmap() returns a pointer to the mapped region.  
     Otherwise, a value of MAP_FAILED is returned and errno is set to indicate 
     the error.

还有一个部分描述了errno也可以设置的 's。

于 2013-03-26T19:38:45.893 回答