在Linux上使用C++读取硬盘扇区

12

如何使用gcc/linux通过C++读取硬盘扇区?是否有我可以使用的标准库或必须下载某些内容?在Windows中,我可以使用CreateFile(...)访问原始磁盘扇区,但我不知道如何在Linux中实现。

我正在Ubuntu LTS 10.4上使用GCC。感谢您的帮助。

3个回答

17

硬盘只是另一个文件(不是“普通文件”而是“设备文件”,但仍然是一个文件)。 以正常方式打开它即可...

int fdes = open("/dev/sda1", O_RDONLY);
if (fdes < 0)
    err(1, "/dev/sda1");
... do more ...
你需要正确的权限才能避免许可错误。请注意,"/dev/sda1" 只是一个示例,它是磁盘 sda 上的第一个分区,确切路径将取决于您的系统。您可以使用 mount 命令列出挂载点,并且您可以使用 /dev/sda/dev/sdb 等来访问整个磁盘(而不仅仅是分区)。
你也可以使用 C++ 的 fstream 或者 C 的 FILE 来打开文件,但我不推荐这样做。如果你使用 open,你会更容易找到示例代码并在论坛上获得帮助。

3
/dev/sda1是一个分区......如果需要原始驱动器访问,您可能会想要使用/dev/sda - David Z
+1 表示“只是另一个文件”,不要去碰 dd。注意权限,你可能需要成为磁盘组的成员或者 root 用户(这不是个好主意)才能执行此操作。 - Flexo
这将非常有帮助。 - Anthoni C

12

正如其他人正确指出的那样,在Linux(和其他类Unix操作系统)上,磁盘访问是通过设备特殊文件进行的。在我的Ubuntu笔记本电脑上,我的硬盘命名为“/dev/sda”。

由于您特别要求使用C++来完成它(不仅仅是在Linux中完成),这里是使用std::ifstream读取一个扇区的方法。

#include <fstream>
#include <cerrno>
#include <stdexcept>
#include <cstring>
#include <vector>

int main() {
  // Which disk?
  char diskName[] = "/dev/sda";
  std::string diskError = std::string() + diskName + ": ";

  // Open device file
  std::ifstream disk(diskName, std::ios_base::binary);

  if(!disk)
    throw(std::runtime_error(diskError + std::strerror(errno)));

  // Seek to 54321'th sector
  disk.seekg(512 * 54321);
  if(!disk)
    throw(std::runtime_error(diskError + std::strerror(errno)));

  // Read in one sector
  std::vector<char> buffer(512);
  disk.read(&buffer[0], 512);
  if(!disk)
    throw(std::runtime_error(diskError + std::strerror(errno)));
}

你知道如何获取磁盘的扇区大小吗? - Patrik Nusszer
@PatrikNusszer - 或许这个可以帮到你:https://dev59.com/PV7Va4cB1Zd3GeqPGAsq - Robᵩ

1

你可以使用dd命令将磁盘扇区转储到文件中,并读取生成的文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接