Boost logo

Boost Users :

Subject: [Boost-users] Can a mapped_file larger than 2GB be random seeked?
From: Narcélio Filho (narcelio_at_[hidden])
Date: 2015-05-04 14:15:22


(I'm resending this because it seems that my other message got garbled.)

I'm writting on random positions on a mapped file, but it seems that if I
seek past 2GB, write something, then seek to a lower position, I got a
segfault. Here is the code:

#include <cassert>
#include <iostream>
#include <fstream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/mapped_file.hpp>

using namespace std;
using boost::iostreams::stream;
using boost::iostreams::mapped_file;

int main(int argc, char** argv)
{
    const size_t GIGA = 1024l*1024l*1024l;
    const size_t FILESIZE = 2l * GIGA + 10000;

    ofstream block("file", ios::binary | ios::out);

    assert(block.good());

    block.seekp(FILESIZE);
    block.write("", 1);
    block.close();

    mapped_file mappedFile("file");
    stream<mapped_file> file(mappedFile, ios::binary|ios::out);

    assert(mappedFile.is_open());

    char buffer[10] = {0};

    cout << 0 << endl;
    file.seekp(0);
    file.write(buffer, 1);

    cout << FILESIZE - 1 << endl;
    file.seekp(FILESIZE - 1);
    file.write(buffer, 1);

    cout << 1 * GIGA << endl;
    file.seekp(1 * GIGA);
    file.write(buffer, 1);

    return 0;
}

I'm compiling under Ubuntu 14.10 (amd64):

$ g++ boost-mmap.cpp -lboost_iostreams
$ ./a.out
0
2147493647
Segmentation fault (core dumped)

Everything is 64-bits:

$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=d39e3dc0c99e666631747e496bf798b92e4d4c71, not stripped

I have the same issue compiling with Visual Studio and running under
Windows 8 (amd64).

What I'm doing wrong?

--
[]s, Narcélio.

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net