指针如何引用硬盘中的段 请让我知道C/C++编程语言中的指针如何引用硬盘中的一个段,比如说存储在1 GB以下。

指针如何引用硬盘中的段 请让我知道C/C++编程语言中的指针如何引用硬盘中的一个段,比如说存储在1 GB以下。,c++,c,linux,pointers,operating-system,C++,C,Linux,Pointers,Operating System,在更详细的内容中,我将编写一个函数的签名,该函数将以指针作为参数,并应指向硬盘中的一个段,该段最多可容纳1GB空间,而不是将指针传递给堆上的地址,该地址具有相同的存储量,我希望它指向硬盘段。系统是Linux,C++语言都是编程语言。p> 你可以看看。这允许将文件映射到主内存。您必须将数据映射到虚拟地址空间 使用open2打开文件或块设备,例如/dev/sda,并在此处传递文件描述符: #include <sys/types.h> #include <sys/stat.h>

在更详细的内容中,我将编写一个函数的签名,该函数将以指针作为参数,并应指向硬盘中的一个段,该段最多可容纳1GB空间,而不是将指针传递给堆上的地址,该地址具有相同的存储量,我希望它指向硬盘段。系统是Linux,C++语言都是编程语言。p> 你可以看看。这允许将文件映射到主内存。

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

使用open2打开文件或块设备,例如/dev/sda,并在此处传递文件描述符:

#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映射文件以进行读写访问,则需要msync2将其刷新到磁盘

小心:如果文件在映射后被另一个进程修改,则使用MAP_PRIVATE映射文件具有未定义的行为。此外,如果在映射之后更改了文件大小,则任何映射都将导致未定义的行为


注意:可以将带有PROT_WRITE的MAP_私有映射写入,但删除映射时,不会将更改写回文件,这些映射也无法同步。

我需要它,因为我只能传递指针,而指针应该指向一个可以容纳大量空间的位置,以便容纳一些二进制映像以备将来安装。感谢Olaf,但是这个需求就像我将要使用的函数签名被一些外部应用程序使用一样,我的应用程序将只调用函数,而实现将由外部应用程序负责。因此,在这种情况下我如何使用mmap,因为我只提供一个接口,最好是一个函数,它将确保外部应用程序在接收指针时获取将在以后使用的二进制图像。@Indranil您不能在程序之间的指针之间传递指针,因为每个程序都有自己的虚拟内存。如果我理解正确,最接近的是sysv shared memory或带有MAP_shared的mmap。非常感谢Sergey,我希望这能帮助我解决一些问题,在映射之后,文件大小不可能更改。您富有洞察力的视图和map_file_descriptr函数为我提供了一些有用的线索。再次感谢。另外需要注意的是,mmap实际上并没有为您的进程分配物理内存。它只创建一个可用的虚拟映射。一旦您开始使用它,文件内容将透明地复制到RAM中,一次复制一页。在MAP_共享映射上交换将把更改写回文件,而不是像msync那样使用交换空间。在映射上交换\u PRIVATE将转到交换空间,如果映射已被修改,因为您有文件的私有副本。