如何使用gcc/linux读取C++中的硬盘扇区?是否有我可以使用的标准库或必须下载的东西?在Windows中,我可以使用CreateFile(...)访问原始磁盘扇区,但我不知道如何在Linux中执行操作。在Linux上使用C++读取硬盘扇区
我在Ubuntu LTS 10.4上使用GCC。感谢您的帮助。
如何使用gcc/linux读取C++中的硬盘扇区?是否有我可以使用的标准库或必须下载的东西?在Windows中,我可以使用CreateFile(...)访问原始磁盘扇区,但我不知道如何在Linux中执行操作。在Linux上使用C++读取硬盘扇区
我在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
代替,您将有更好的时间查找示例代码并获得论坛帮助。
你可以转储磁盘扇区用dd命令文件和读取文件生成
正如其他人正确地指出,在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)));
}
谢谢你,这是非常有用的代码。 –
'的/ dev/sda1'将是一个分区......对原始驱动器访问你可能想用'的/ dev/sda' –
+1“只是一个文件”,而不是搞乱' dd'。要小心权限,你可能需要成为磁盘组或root的成员(不是一个好主意)才能这样做。 – Flexo
这将是非常有帮助的。 –