Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的mmap代码中的哪些设置将所有文件数据设置为零?_C++_Linux_Mmap - Fatal编程技术网

C++ 我的mmap代码中的哪些设置将所有文件数据设置为零?

C++ 我的mmap代码中的哪些设置将所有文件数据设置为零?,c++,linux,mmap,C++,Linux,Mmap,我正在实现流的一半,您应该能够前后跳转X个整数。最重要的是,当我打开一个文件时,它应该保留文件中的数据。在这个实现中,我尝试使用mmap。我的问题是,当我第二次打开一个文件时,映射的数据纯粹是零。我的open方法名为createStream,如下所示: void MapperOutForward::createStream(const char* filename) { this->filename = filename; pFile = open(filename, O_

我正在实现流的一半,您应该能够前后跳转X个整数。最重要的是,当我打开一个文件时,它应该保留文件中的数据。在这个实现中,我尝试使用mmap。我的问题是,当我第二次打开一个文件时,映射的数据纯粹是零。我的open方法名为createStream,如下所示:

void MapperOutForward::createStream(const char* filename)
{
    this->filename = filename;
    pFile = open(filename, O_RDWR | O_CREAT | O_SYNC, S_IRWXG|S_IRWXO|S_IRWXU);
    if ( pFile ==  -1) 
    {
        int errsv = errno;
        cout << "MappedStreamOut createStream open error: " << strerror( errno ) << endl;
    }

    //getting file size and making the file big enough
    struct stat filestatus;
    stat( filename, &filestatus );
    if(filestatus.st_size < mapSize + 1)
    {
        lseek (pFile, mapSize + 1, SEEK_SET);
        write (pFile, "", 1);
    }
    lseek (pFile, 0, SEEK_SET);

    map = (int*) mmap (0, mapSize, PROT_WRITE | PROT_READ, MAP_PRIVATE, pFile, 0);
    close (pFile);

    if ( map == (int*) -1) 
    {
        cout << "MappedStreamOut createStream mmap error: " << strerror(errno) << endl;
    }

    numberOfOffsets = 1;
    numberOfElementsInMap = 0;

    cout << "Kopirer 5 før og 4 efter i Create" << endl;
    for(int i = 0; i < numberOfElementsInMap + 5; i++)
    {
        cout << map[i] << endl;
    }
    cout << "Create numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl; 
}
void MapperOutForward::createStream(const char*filename)
{
此->文件名=文件名;
pFile=open(文件名,O|RDWR | O|u CREAT | O|u SYNC,S|IRWXG | S|IRWXO | S|IRWXU);
如果(pFile==-1)
{
int errsv=errno;

cout您可能需要
MAP\u SHARED
而不是
MAP\u PRIVATE
,否则更改不会写入文件,如所指定

MAP\u SHARED
MAP\u PRIVATE
描述写入的配置 对内存对象的引用。如果指定了
MAP\u SHARED
,则写入 引用将更改基础对象。如果
MAP\u PRIVATE
为 指定调用进程对映射数据的修改 应仅对呼叫过程可见,且不得改变 底层对象


是的,等3分钟,我才可以给你打上正确的分数。
#include "MapperOutForward.h"

using namespace std;

#include <cstdlib>
#include <iostream>

#include <fcntl.h>
#include <sys/stat.h>
#include <cmath>

MapperOutForward::MapperOutForward(int mapSize) //number of pages
{ 
    pageSize = getpagesize();
    this->mapSize = mapSize * pageSize; //we work in pages
    numberOfElementsInMap = 0;
    numberOfOffsets = 0;
}

MapperOutForward::~MapperOutForward() 
{ 
    munmap(map, mapSize);
}

void MapperOutForward::createStream(const char* filename)
{
    this->filename = filename;
    pFile = open(filename, O_RDWR | O_CREAT | O_SYNC, S_IRWXG|S_IRWXO|S_IRWXU);
    if ( pFile ==  -1) 
    {
        int errsv = errno;
        cout << "MappedStreamOut createStream open error: " << strerror( errno ) << endl;
    }

    //getting file size and making the file big enough
    struct stat filestatus;
    stat( filename, &filestatus );
    if(filestatus.st_size < mapSize + 1)
    {
        lseek (pFile, mapSize + 1, SEEK_SET);
        write (pFile, "", 1);
    }
    lseek (pFile, 0, SEEK_SET);

    map = (int*) mmap (0, mapSize, PROT_WRITE | PROT_READ, MAP_PRIVATE, pFile, 0);
    close (pFile);

    if ( map == (int*) -1) 
    {
        cout << "MappedStreamOut createStream mmap error: " << strerror(errno) << endl;
    }

    numberOfOffsets = 1;
    numberOfElementsInMap = 0;

    cout << "Kopirer 5 før og 4 efter i Create" << endl;
    for(int i = 0; i < numberOfElementsInMap + 5; i++)
    {
        cout << map[i] << endl;
    }
    cout << "Create numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl; 
}

void MapperOutForward::writeNext(int* data, int numberOfElements)
{
    for(int i = 0; i < numberOfElements; i++)
    {
        writeHelper(data[i]);
    }   

    cout << "Kopirer 5 før og 4 efter i writeNext" << endl;
    for(int i = numberOfElementsInMap - 5; i < numberOfElementsInMap + 5; i++)
    {
        cout << map[i] << endl;
    }
    //cout << "WriteNext numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl;
}

void MapperOutForward::writeHelper(int data)
{
    int sizeOfInt = 4; //bytes
    if(numberOfElementsInMap >= mapSize / sizeOfInt) //We need to create the next part of the file
    {
        munmap(map, mapSize);

        pFile = open(filename, O_RDWR | O_CREAT | O_SYNC, S_IRWXG|S_IRWXO|S_IRWXU);

        if ( pFile ==  -1) 
        {
            std::cout<<"filename: "<<filename<<std::endl;
            std::cout<<"mapSize: "<<mapSize<<std::endl;

            int errsv = errno;
            cout << "MappedStreamOut writeNext open error: " << strerror( errno ) << endl;
        }

        numberOfOffsets++;

        //Make the file bigger 
        lseek (pFile, mapSize * numberOfOffsets, SEEK_SET);
        write (pFile, "", 1);
        lseek (pFile, 0, SEEK_SET);

        map = (int*) mmap (0, mapSize, PROT_WRITE | PROT_READ, MAP_PRIVATE, pFile, mapSize * (numberOfOffsets - 1));
        close (pFile);

        if ( map == (int*) -1) 
        {
            cout << "MappedStreamOut writeNext mmap error: " << strerror(errno) << endl;
        }

        numberOfElementsInMap = 0;
    }

    map[numberOfElementsInMap] = data;
    numberOfElementsInMap++;
}

void MapperOutForward::jumpTo(int offset)
{
    int sizeOfInt = 4; //bytes
    //cout << "numberOfElementsInMap + offset " << numberOfElementsInMap + offset << endl;
    //cout << "mapSize / sizeOfInt " << mapSize / sizeOfInt << endl;
    if(numberOfElementsInMap + offset >= mapSize / sizeOfInt)
    {
        munmap(map, mapSize);

        pFile = open(filename, O_RDWR | O_CREAT | O_SYNC, S_IRWXG|S_IRWXO|S_IRWXU);

        if ( pFile ==  -1) 
        {
            std::cout<<"filename: "<<filename<<std::endl;
            std::cout<<"mapSize: "<<mapSize<<std::endl;

            int errsv = errno;
            cout << "MappedStreamOut writeNext open error: " << strerror( errno ) << endl;
        }

        numberOfOffsets += (int) ceil( (double) (numberOfElementsInMap + offset - (mapSize / sizeOfInt)) / (mapSize / sizeOfInt)); // rundet op ((resterende antal ints ud over mapSize) / (Antal ints i en mapsize)) = Antal offsets der skal springes

        //Make the file bigger 
        lseek (pFile, mapSize * numberOfOffsets, SEEK_SET);
        write (pFile, "", 1);
        lseek (pFile, 0, SEEK_SET);

        map = (int*) mmap (0, mapSize, PROT_WRITE | PROT_READ, MAP_PRIVATE, pFile, mapSize * (numberOfOffsets - 1));
        close (pFile);

        if ( map == (int*) -1) 
        {
            cout << "MappedStreamOut writeNext mmap error: " << strerror(errno) << endl;
        }

        numberOfElementsInMap = (numberOfElementsInMap + offset - (mapSize / sizeOfInt)) % (mapSize / sizeOfInt); //(resterende antal ints ud over mapSize) % (Antal ints i en mapsize) = Antal elementer ind i offsettet
        //cout << "JumpTo offsetForward numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl;
    }
    else if(numberOfElementsInMap + offset < 0)
    {
        munmap(map, mapSize);

        pFile = open(filename, O_RDWR | O_CREAT | O_SYNC, S_IRWXG|S_IRWXO|S_IRWXU);

        if ( pFile ==  -1) 
        {
            std::cout<<"filename: "<<filename<<std::endl;
            std::cout<<"mapSize: "<<mapSize<<std::endl;

            int errsv = errno;
            cout << "MappedStreamOut writeNext open error: " << strerror( errno ) << endl;
        }

        numberOfOffsets += (int) floor( (double) (numberOfElementsInMap + offset) / (mapSize / sizeOfInt)); // rundet op ((resterende antal ints ud over mapSize) / (Antal ints i en mapsize)) = Antal offsets der skal springes

        //Make the file bigger 
        lseek (pFile, mapSize * numberOfOffsets, SEEK_SET);
        write (pFile, "", 1);
        lseek (pFile, 0, SEEK_SET);

        map = (int*) mmap (0, mapSize, PROT_WRITE | PROT_READ, MAP_PRIVATE, pFile, mapSize * (numberOfOffsets - 1));
        close (pFile);

        if ( map == (int*) -1) 
        {
            cout << "MappedStreamOut writeNext mmap error: " << strerror(errno) << endl;
        }

        numberOfElementsInMap = (mapSize + (numberOfElementsInMap + offset)) % (mapSize / sizeOfInt); //(resterende antal ints ud over mapSize) % (Antal ints i en mapsize) = Antal elementer ind i offsettet
        //cout << "JumpTo offsetBacward numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl;
    }
    else
    {
        numberOfElementsInMap += offset;
        //cout << "JumpTo else numberOfOffsets:numberOfElementsInMap " << numberOfOffsets << ":" << numberOfElementsInMap << endl;
    }
}

void MapperOutForward::closeStream()
{
    munmap(map, mapSize);
}
#include "MapperInForward.h"
#include "MapperOutForward.h"
//#include "MapperOutBackward.h"
//#include "MapperInBackward.h"
//#include "MapperStreamFactory.h"
#include <functional>

int main( int argc, const char* argv[] )
{
/*********************Tester Buffer Stream*************************************/
    close(open((char*) "mapperTest", O_WRONLY | O_CREAT | O_SYNC | O_TRUNC, S_IRWXG|S_IRWXO|S_IRWXU));
    //BufferStreamFactory* bsf = new BufferStreamFactory(3);

    MapperOutForward* mso = new MapperOutForward(1);
    mso->createStream((char*) "mapperTest");

    int data[4000];

    for(int i = 0; i < 4000; i++)
    {
        data[i] = i + 1;
    }

    mso->writeNext(data, 4000);
    mso->closeStream();

    MapperOutForward* mso1 = new MapperOutForward(1);
    mso1->createStream((char*) "mapperTest");

    data[0] = 9999;

    mso1->jumpTo(0);

    mso1->jumpTo(100);
    mso1->writeNext(data, 1);

    mso1->jumpTo(1000);
    mso1->writeNext(data, 1);

    mso1->jumpTo(-900);
    mso1->writeNext(data, 1);

    mso1->closeStream();
}