0

ポインター (C / C++ プログラミング言語) がハードディスク内のセグメント (最大 1 GB のストレージ) を参照する方法を教えてください。

詳細については、ポインタを引数として取り、アドレスを指すポインタを渡す代わりに、最大 1 GB のスペースを保持できるハードディスク内のセグメントを指す関数のシグネチャを記述します。同じ量のストレージを保持します。ヒープ上で、ハードディスクセグメントを指すようにします。システムは Linux で、プログラミング言語は C と C++ の両方です。

4

2 に答える 2

5

を調べることができますmmap。これにより、ファイルをメイン メモリにマップできます。

于 2012-11-26T16:47:19.620 に答える
4

データを仮想アドレス空間にマップする必要があります。

ファイルまたはブロック デバイス (例: /dev/sda) を開き、open(2)ここにファイル記述子を渡します。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>

void * map_file_descriptr(int fd) {
    struct stat file_stat;
    if (fstat(fd, &file_stat)) {
        perror("fstat");
        // do something on error
        return NULL;
    }

    void * data = mmap(
          NULL // place the the VM segment anywhere in the process virtual address space
        , file_stat.st_size // file size
        // For read-only:
        , PROT_READ
        , MAP_PRIVATE
        // for read-write
        /*
        , PROT_READ | PROT_WRITE
        , MAP_SHARED
        */
        , fd // file which belongs to this file descriptor
        , 0 // from the beginning
        );

    if (data == MAP_FAILED) {
        perror("mmap");
        // you most likely are out of memory to allocate the VM table
        // this very rarely happens
        return NULL;
    }

    return data;
}

ファイルを読み取り/書き込みアクセス用にマップした場合は、更新をディスクにフラッシュするMAP_SHARED必要があります。msync(2)

注意:MAP_PRIVATEファイルがマッピング後に別のプロセスによって変更された場合、ファイルをマッピングすると、未定義の動作が発生します。また、マッピング後にファイル サイズが変更された場合、マッピングによって未定義の動作が発生します。

注:のMAP_PRIVATEマッピングPROT_WRITEは書き込み可能ですが、マッピングが削除されたときに変更がファイルに書き戻されることはなく、それらのマッピングも同期できません。

于 2012-11-26T18:09:33.857 に答える