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

你如何用C / C ++读取硬盘扇区? 有一个标准的图书馆,我可以使用或必须下载? 在Windows中,我可以使用CreateFile(…)访问原始磁盘扇区,但我不知道如何在Linux中执行操作。

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

Solutions Collecting From Web of "在Linux上用C ++读取硬盘扇区"

硬盘只是另一个文件(不是“常规文件”,而是“设备文件”,但仍然是一个文件)。 打开它的正常方式…

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命令将磁盘扇区转储到文件并读取生成的文件