gcc/linuxを使用してC++でハードディスクセクタを読み取るにはどうすればよいですか?私が使用できる標準ライブラリがありますか、ダウンロードする必要がありますか? Windowsでは、CreateFile(...)を使ってrawディスクセクタにアクセスできますが、Linuxではどうやってやるのか分かりません。LinuxのC++でハードディスクセクタを読み取る
私はUbuntu LTS 10.4でGCCを使用しています。ご協力ありがとうございました。
gcc/linuxを使用してC++でハードディスクセクタを読み取るにはどうすればよいですか?私が使用できる標準ライブラリがありますか、ダウンロードする必要がありますか? Windowsでは、CreateFile(...)を使ってrawディスクセクタにアクセスできますが、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
の最初のパーティションであり、正確なパスはシステムによって異なります。あなたはまた、C++ fstream
またはC FILE
としてそれを開くことができますが、私にはない
mount
コマンドでマウントポイントを一覧表示することができ、あなたは
/dev/sda
、
/dev/sdb
を使用してディスク全体(だけではなく、パーティション)にアクセスすることができますこれをお勧めします。
open
を代わりに使用すると、サンプルコードを見つけてフォーラムのヘルプを表示するのに適しています。
あなたはddコマンドでファイルにディスクセクタをダンプし、他の人が正しく指摘したように、ファイルが
を生成読み取ることができ、Linuxの(および他のUnixライクなオペレーティングシステム)上のディスクアクセスは、特別なデバイスを介してですファイル。私のUbuntuラップトップでは、私のハードドライブは "/ dev/sda"という名前です。
具体的には、C++で行う方法(Linuxでの実行方法だけではありません)には、std::ifstream
を使用して1つのセクタを読み取る方法があります。
#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
これは非常に役に立ちます。 –