2014-10-24 16 views
5

Come si legge/scrive un dispositivo a blocchi? Ho sentito che ho letto/scrittura come un normale file di configurazione in modo che un dispositivo di loop facendoCome si legge/scrive un dispositivo a blocchi?

sudo losetup /dev/loop4 ~/file 

Poi ho eseguito l'applicazione sul file allora il dispositivo ciclo

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

Il file eseguiti perfettamente. Il dispositivo loop legge 0 byte. In entrambi i casi ho ottenuto FP == 3 e disattivato == 0. Il file ottiene correttamente la lunghezza della stringa e stampa la stringa mentre il ciclo ottiene 0 e non stampa nulla

Come si legge/scrive su un dispositivo a blocchi?

#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

quanto grande è la vostra '~/file'? fare 'losetup' per file di piccole dimensioni può essere inutile o invisibile per gli strumenti di sistema. – ymonad

+0

@ymonad È una frase, circa 40 byte. Ho provato un nuovo file usando 'dd if =/dev/zero di = ~/file2 count = 10K' quindi modificandolo con vi. Sembra funzionare. Lo ignora solo perché ho un piccolo file o ignora i blocchi quando è <4K? Se avessi un 8k + 20 byte, gli ultimi 20 byte sono ignorati? Grazie per il commento –

+1

Nel mio ambiente 'losetup' mi dai un avvertimento per file di grandi dimensioni: _" Attenzione: il file non rientra in un settore da 512 byte, la fine del file verrà ignorata "_, e per file di piccole dimensioni: _ "Attenzione: il file è più piccolo di 512 byte, il dispositivo loop può essere inutile o invisibile per gli strumenti di sistema." _. Quindi quest'ultimo potrebbe essere corretto. – ymonad

risposta

6

Il file losetup sembra mappare in settori di 512 byte. Se la dimensione del file non è un multiplo di 512, il resto verrà troncato.

Quando la mappatura di un file per /dev/loopX con losetup, per fiile che è più piccolo di 512 byte ci dà seguente avvertimento:

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

Per file di cui la dimensione non può essere diviso per 512:

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

Questo avviso è stato aggiunto dal util-linux ver 2.22 in this commit

Problemi correlati