[英]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.