指针如何引用硬盘中的段
How a pointer can reference to a segment in hard disk
请让我知道指针(在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
的映射,但是在删除映射时更改不会写回文件,这些映射也无法同步。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 指针如何引用硬盘中的段