2011-09-02 26 views
7

gcc/linuxを使用してC++でハードディスクセクタを読み取るにはどうすればよいですか?私が使用できる標準ライブラリがありますか、ダウンロードする必要がありますか? Windowsでは、CreateFile(...)を使ってrawディスクセクタにアクセスできますが、Linuxではどうやってやるのか分かりません。LinuxのC++でハードディスクセクタを読み取る

私はUbuntu LTS 10.4でGCCを使用しています。ご協力ありがとうございました。

答えて

11

ハードディスクは単なる「通常ファイル」ではなく「デバイスファイル」ですが、それでもファイルです。通常の方法で開きます...

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を代わりに使用すると、サンプルコードを見つけてフォーラムのヘルプを表示するのに適しています。

+1

'は/ dev/sda1'はパーティションだろう...生のドライブへのアクセスのために、あなたはおそらく、「ちょうど別のファイル」のための'の/ dev/sda' –

+0

1を使用したいと思いますし、 'いじりませんdd'。権限を忘れないようにするには、これを行うには、おそらくディスクグループのメンバかroot(素晴らしいアイデアではない)のいずれかである必要があります。 – Flexo

+0

これは非常に役に立ちます。 –

1

あなたはddコマンドでファイルにディスクセクタをダンプし、他の人が正しく指摘したように、ファイルが

7

を生成読み取ることができ、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))); 
} 
+0

ありがとうございます。これは非常に便利なコードです。 –

関連する問題