簡體   English   中英

在Linux上用C ++讀取硬盤扇區

[英]Reading Hard Disk Sectors in C++ on Linux

你如何用gcc / linux讀取C ++中的硬盤扇區? 是否有可以使用的標准庫或必須下載的東西? 在Windows中,我可以使用CreateFile(...)訪問原始磁盤扇區,但我不知道如何在Linux中進行操作。

我在Ubuntu LTS 10.4上使用GCC。 謝謝您的幫助。

硬盤只是另一個文件(不是“常規文件”,而是“設備文件”,但仍然是文件)。 以正常方式打開它......

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您將有更好的時間查找示例代碼並在論壇上獲得幫助。

正如其他人正確指出的那樣,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)));
}

您可以使用dd命令將磁盤扇區轉儲到文件,並讀取生成的文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM