2011-09-02 24 views
7

Come si leggono i settori del disco rigido in C++ con gcc/linux? C'è una libreria standard che posso usare o qualcosa deve essere scaricato? In Windows posso usare CreateFile (...) per accedere ai settori del disco raw, ma non so come farlo in Linux.Leggere i settori del disco rigido in C++ su Linux

Sto usando GCC su Ubuntu LTS 10.4. Grazie per l'aiuto.

risposta

11

Il disco rigido è solo un altro file (non un "file normale" ma un "file di dispositivo", ma ancora un file). Aprilo nel modo normale ...

int fdes = open("/dev/sda1", O_RDONLY); 
if (fdes < 0) 
    err(1, "/dev/sda1"); 
... do more ... 

Si otterranno errori di autorizzazione a meno che non si disponga delle autorizzazioni corrette. Notare che "/dev/sda1" è solo un esempio, è la prima partizione sul disco sda, il percorso esatto dipende dal sistema. Si possono elencare i punti di montaggio con il comando mount, ed è possibile accedere a interi dischi (anziché solo partizioni) utilizzando /dev/sda, /dev/sdb, ecc

Si potrebbe anche aprire come C++ fstream o C FILE, ma non lo faccio consiglia questo. Avrai un tempo migliore per trovare codice di esempio e ottenere aiuto sui forum se utilizzi invece open.

+1

'/ dev/sda1' sarebbe una partizione ... per l'accesso in auto grezzo si sarebbe probabilmente vuole utilizzare'/dev/sda' –

+0

+1 per "solo un altro file" e non scherzi con ' dd'. Fai attenzione ai permessi, probabilmente dovrai essere un membro del gruppo di dischi o root (non una grande idea) per farlo. – Flexo

+0

Che questo sarà molto utile. –

1

è possibile scaricare i settori del disco in un file con il comando dd e leggere generato il file

7

Come altri hanno giustamente sottolineato, l'accesso al disco su Linux (e altri sistemi operativi Unix-like) avviene tramite uno speciale dispositivo file. Sul mio portatile Ubuntu, il mio disco fisso è chiamato "/ dev/sda".

Poiché si chiede specificamente come farlo in C++ (non solo come farlo in Linux), ecco come leggere un settore utilizzando 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))); 
} 
+0

Grazie anche a te, questo è un codice molto utile. –

Problemi correlati