2011-09-02 52 views
7

Làm thế nào để bạn đọc các sector đĩa cứng trong C++ bằng gcc/linux? Có thư viện chuẩn nào mà tôi có thể sử dụng hoặc phải tải xuống nội dung nào đó không? Trong Windows tôi có thể sử dụng CreateFile (...) để truy cập các sector đĩa thô, nhưng tôi không biết cách làm trong Linux.Đọc các Ổ đĩa cứng trong C++ trên Linux

Tôi đang sử dụng GCC trên Ubuntu LTS 10.4. Cảm ơn sự giúp đỡ của bạn.

Trả lời

11

Đĩa cứng chỉ là một tệp khác (không phải là "tệp thông thường" nhưng "tệp thiết bị", nhưng vẫn là một tệp). Mở nó theo cách thông thường ...

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

Bạn sẽ nhận được các lỗi về quyền trừ khi bạn có quyền phù hợp. Lưu ý rằng "/dev/sda1" chỉ là một ví dụ, nó là phân vùng đầu tiên trên đĩa sda, đường dẫn chính xác sẽ phụ thuộc vào hệ thống của bạn. Bạn có thể liệt kê điểm lắp với lệnh mount, và bạn có thể truy cập toàn bộ đĩa (thay vì chỉ phân vùng) sử dụng /dev/sda, /dev/sdb vv

Bạn cũng có thể mở nó như là một C++ fstream hoặc C FILE, nhưng tôi không đề nghị điều này. Bạn sẽ có thời gian tìm mã ví dụ tốt hơn và nhận trợ giúp trên diễn đàn nếu bạn sử dụng open thay thế.

+1

'/ dev/sda1' sẽ là một phân vùng ... để truy cập ổ đĩa liệu bạn có thể muốn sử dụng'/dev/sda' –

+0

1 cho "chỉ tập tin khác" và không rối tung với ' dd'. Hãy cảnh giác với các điều khoản, có thể bạn sẽ cần phải là thành viên của nhóm đĩa hoặc gốc (không phải là một ý tưởng tuyệt vời) để làm điều này. – Flexo

+0

Điều này sẽ rất hữu ích. –

1

bạn có thể đổ thành phần đĩa vào một tập tin với lệnh dd và đọc các tập tin được tạo

7

Như những người khác đã chỉ ra một cách chính xác, truy cập đĩa trên Linux (và các hệ điều hành Unix-like khác) là thông qua một thiết bị đặc biệt tập tin. Trên máy tính xách tay Ubuntu của tôi, ổ đĩa cứng của tôi có tên là "/ dev/sda".

Vì bạn đặc biệt yêu cầu làm thế nào để làm điều đó trong C++ (không chỉ đơn thuần là làm thế nào để làm điều đó trong Linux), đây là cách đọc một khu vực sử dụng 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

Cảm ơn bạn là tốt, đây là mã rất hữu ích. –

Các vấn đề liên quan