2014-10-24 14 views
5

Làm cách nào để đọc/ghi thiết bị chặn? Tôi nghe tôi đọc/ghi giống như một tập tin bình thường vì vậy tôi thiết lập một thiết bị vòng lặp bằng cách làmLàm cách nào để đọc/ghi thiết bị chặn?

sudo losetup /dev/loop4 ~/file 

Sau đó, tôi chạy ứng dụng trên các tập tin sau đó thiết bị loop

sudo ./a.out file 
sudo ./a.out /dev/loop4 

Các tập tin thực thi một cách hoàn hảo. Thiết bị vòng lặp đọc 0 byte. Trong cả hai trường hợp, tôi nhận FP == 3 và off == 0. Các tập tin chính xác được chiều dài chuỗi và in chuỗi trong khi vòng lặp được tôi 0 và in không có gì

Làm thế nào để đọc/ghi vào một thiết bị khối?

#include <fcntl.h> 
#include <cstdio> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    char str[1000]; 

    if(argc<2){ 
     printf("Error args\n"); 
     return 0; 
    } 

    int fp = open(argv[1], O_RDONLY); 
    printf("FP=%d\n", fp); 
    if(fp<=0) { 
     perror("Error opening file"); 
     return(-1); 
    } 
    off_t off = lseek(fp, 0, SEEK_SET); 
    ssize_t len = read(fp, str, sizeof str); 
    str[len]=0; 
    printf("%d, %d=%s\n", len, static_cast<int>(off), str); 

    close(fp); 
} 
+0

tệp '~/file' lớn đến mức nào? làm 'losetup' cho tập tin nhỏ có thể vô ích hoặc vô hình đối với các công cụ hệ thống. – ymonad

+0

@ymonad Một câu của nó, khoảng 40bytes. Tôi đã thử một tập tin mới bằng cách sử dụng 'dd if =/dev/zero = ~/file2 count = 10K' rồi chỉnh sửa nó bằng vi. Dường như nó hoạt động. Nó chỉ bỏ qua nó vì tôi có một tập tin nhỏ hay nó bỏ qua các khối khi <4K của nó? Nếu tôi có một 8k + 20bytes là 20bytes cuối cùng bị bỏ qua? Cảm ơn cho bình luận –

+1

Trong môi trường của tôi 'losetup' cho tôi một cảnh báo cho tập tin lớn: _" Cảnh báo: tập tin không phù hợp với một khu vực 512 byte, kết thúc của tập tin sẽ bị bỏ qua "_, và cho tập tin nhỏ: _ "Cảnh báo: tệp nhỏ hơn 512 byte; thiết bị vòng lặp có thể vô dụng hoặc vô hình đối với các công cụ hệ thống." _. Vì vậy, sau này có thể là chính xác. – ymonad

Trả lời

6

losetup dường như ánh xạ tệp trong các sector 512 byte. Nếu kích thước tệp không phải là bội số của 512, thì phần còn lại sẽ bị cắt bớt.

Khi ánh xạ một tập tin để /dev/loopX với losetup, cho fiile đó là nhỏ hơn 512 byte nó mang lại cho chúng ta cảnh báo sau đây:

Warning: file is smaller than 512 bytes; 
the loop device may be useless or invisible for system tools. 

Đối với hồ mà kích thước không thể được chia cho 512:

Warning: file does not fit into a 512-byte sector; 
the end of the file will be ignored 

Cảnh báo này đã được thêm từ util-linux ver 2.22 trong this commit

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