2011-09-02 27 views
7

¿Cómo se leen los sectores de disco duro en C++ con gcc/linux? ¿Hay una biblioteca estándar que pueda usar o deba descargar algo? En Windows puedo usar CreateFile (...) para acceder a sectores de disco sin formato, pero no sé cómo hacerlo en Linux.Lectura de sectores de disco duro en C++ en Linux

Estoy usando GCC en Ubuntu LTS 10.4. Gracias por tu ayuda.

Respuesta

11

El disco duro es solo otro archivo (no es un "archivo normal" sino un "archivo de dispositivo", pero sigue siendo un archivo). Ábralo de la manera normal ...

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

Recibirá los permisos de error a menos que tenga los permisos correctos. Tenga en cuenta que "/dev/sda1" es solo un ejemplo, es la primera partición en el disco sda, la ruta exacta dependerá de su sistema. Se pueden listar los puntos de montaje con el comando mount, y se puede acceder a los discos enteros (en lugar de sólo las particiones) usando /dev/sda, /dev/sdb, etc.

También puede abrirlo como no en C++ fstream o C FILE, pero lo hago recomiendo esto Lo mejor será encontrar el código de ejemplo y obtener ayuda en los foros si usa open.

+1

'/ dev/sda1' sería una partición ... de acceso a la unidad cruda lo que probablemente desea utilizar'/dev/sda' –

+0

1 "sólo por otro archivo" y que no ensucia con ' dd'. Tenga cuidado con los permisos, es probable que necesite ser miembro del grupo de discos o de la raíz (no es una gran idea) para hacer esto. – Flexo

+0

Que esto será de mucha ayuda. –

1

se puede volcar los sectores del disco en un archivo con el comando dd y leer el archivo generado

7

Como otros han señalado correctamente, el acceso al disco en Linux (y otros sistemas operativos basados ​​en Unix) es a través de un dispositivo especial archivo. En mi computadora portátil Ubuntu, mi disco duro se llama "/ dev/sda".

Ya que específicamente preguntas cómo hacerlo en C++ (no solo cómo hacerlo en Linux), aquí está cómo leer un sector usando 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

Gracias también, este es un código muy útil. –

Cuestiones relacionadas