指针如何引用硬盘中的段

How a pointer can reference to a segment in hard disk

本文关键字:硬盘 引用 何引用 指针      更新时间:2023-10-16

请让我知道指针(在C/C++编程语言中)如何引用硬盘中的段,例如存储高达1 GB。

在更详细的情况下,我将编写一个函数的签名,该函数将指针作为参数,并且应该指向硬盘中的段,该段最多可容纳 1 GB 空间,而不是传递指向地址的指针,该地址拥有相同数量的存储空间,在堆上我希望它指向硬盘段。 系统是Linux, 编程语言C和C++。

你可以查看mmap .这允许将文件映射到主内存中。

您必须将数据映射到虚拟地址空间。

打开您的文件或块设备(例如 /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的映射,但是在删除映射时更改不会写回文件,这些映射也无法同步。