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 現在、ガードマロック、ガードエッジ、落書き、ゾンビがオンになっているシミュレーターでのみ取得します

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設定される可能性のある'について説明するセクションもあります。

于 2013-03-26T19:38:45.893 に答える