Как мне прочитать / записать блочное устройство?

Как мне прочитать / записать блочное устройство? Я слышал, что я читаю / пишу как обычный файл, поэтому я настраиваю устройство петли, выполняя

sudo losetup /dev/loop4 ~/file

Затем я запустил приложение на файл, затем устройство петли

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

Файл выполнен отлично. Устройство цикла читает 0 байтов. В обоих случаях я получил FP==3 и выключил ==0. Файл правильно получает длину строки и печатает строку, в то время как цикл возвращает мне 0 и ничего не печатает

Как я могу читать / писать на блочное устройство?

#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);
}

2 ответа

Решение

losetup Кажется, файл карты в 512-байтовых секторах. Если размер файла не кратен 512, то остальные будут усечены.

При отображении файла в /dev/loopX с losetupдля файла, который меньше 512 байт, он дает нам следующее предупреждение:

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

Для файла, размер которого не может быть разделен на 512:

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

Это предупреждение было добавлено с util-linux Версия 2.22 в этом коммите

Вы не можете поместить нули или случайные значения в файл, чтобы получить выравнивание по 512 байтам. Используйте первые несколько байтов для хранения размера файла, а затем содержимое файла. Теперь вы знаете, где заканчивается содержимое файла. Вы вводите случайные данные для достижения выравнивания 512.

например, файловая структура:

[Размер файла] [Данные][<заполнение для выравнивания по 512>]

Другие вопросы по тегам