linux中存在哪些C++中低级磁盘操作的方法?我正在尝试在磁盘上编写自己的数据管理器。例如,我想在 Linux 环境中创建一个 C++ 程序,在磁盘上分配一定数量(连续),然后自由地允许我读取/写入该数据块。我不认为我想使用该标准fstream::open
,因为文件由操作系统管理,我可能无法在磁盘上获得连续的部分。
谢谢。
linux中存在哪些C++中低级磁盘操作的方法?我正在尝试在磁盘上编写自己的数据管理器。例如,我想在 Linux 环境中创建一个 C++ 程序,在磁盘上分配一定数量(连续),然后自由地允许我读取/写入该数据块。我不认为我想使用该标准fstream::open
,因为文件由操作系统管理,我可能无法在磁盘上获得连续的部分。
谢谢。
通常,Linux 中用户程序1的“低级”磁盘操作涉及打开磁盘专用设备。在我的计算机上,这些名称被称为“/dev/sda”或“/dev/sda4”,甚至是“/dev/disk/by-uuid/2a5150b4-71cb-11e1-b2fe-3b0d270b4e16”。
您在选择设备文件时应格外小心。使用它写入系统分区不是一个好主意。此外,在大多数情况下,打开设备文件需要 root 访问权限(原因很明显)。
是否使用的问题fstream
是正交的。您可以使用std::fstream
,fopen
甚至open
打开设备。然后使用与您所做的打开匹配的任何读取操作。
对于您的具体示例,您可能会重新考虑是否需要此功能。引用Wikipedia,而后者又引用了Linux System Administrator Guide:
然而,正如 Linux 系统管理员指南所述,“现代 Linux 文件系统通过将文件中的所有块保持在一起,即使它们不能存储在连续的扇区中,也可以将碎片保持在最低限度。一些文件系统,如 ext3,有效地分配最接近文件中其他块的空闲块。因此在 Linux 系统中不必担心碎片。”
1由于您提到 C++,我假设您正在编写用户程序而不是设备驱动程序。真正的“低级”磁盘操作仅在内核内部可用。实际上,如果您想编写设备驱动程序,请重新提出您的问题以明确这一点。
我不知道使用标准 Linux 文件系统有什么方法可以做到这一点。我认为您必须有一个单独的分区并直接在其dev
伪文件(例如/dev/sda2
)上执行 I/O。
您应该使用系统调用。这里有一个列表:linux系统调用