2014-10-24 10 views
5

Wie lese/schreibe ich ein Blockgerät? Ich hörte ich lesen/schreiben wie eine normale Datei, damit ich Setup ein Loop-Gerät vonWie lese/schreibe ich ein Blockgerät?

tun
sudo losetup /dev/loop4 ~/file 

Dann lief ich die App auf die Datei dann auf die Loop-Gerät

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

Die Datei perfekt ausgeführt. Das Schleifengerät liest 0 Bytes. In beiden Fällen habe ich FP == 3 und off == 0. Die Datei erhält korrekt die Zeichenfolgenlänge und druckt die Zeichenfolge, während die Schleife mich 0 und druckt nichts

Wie lese/schreibe ich auf ein Blockgerät?

#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

hinzugefügt, wie groß ist Ihr '~/file'? 'Losetup' für kleine Dateien kann für Systemtools nutzlos oder unsichtbar sein. – ymonad

+0

@ymonad Es ist ein Satz, etwa 40 Bytes. Ich habe eine neue Datei ausprobiert, indem ich 'dd if =/dev/zero von = ~/file2 count = 10K' benutzt und dann mit vi bearbeite. Es scheint zu funktionieren. Wird es nur ignoriert, weil ich eine kleine Datei habe oder Blöcke ignoriert, wenn es <4K ist? Wenn ich ein 8k + 20bytes hatte, werden die letzten 20bytes ignoriert? Danke für den Kommentar –

+1

In meiner Umgebung "losetup" geben Sie mir eine Warnung für große Datei: _ "Warnung: Datei passt nicht in einen 512-Byte-Sektor; das Ende der Datei wird ignoriert" _, und für kleine Datei: _ "Warnung: Datei ist kleiner als 512 Byte; das Loop-Gerät kann für System-Tools nutzlos oder unsichtbar sein." _. Letzteres mag also stimmen. – ymonad

Antwort

6

Die losetup scheint die Datei in 512-Byte-Sektoren zuzuordnen. Wenn die Dateigröße nicht ein Vielfaches von 512 ist, wird der Rest abgeschnitten.

Bei der Zuordnung einer Datei zu /dev/loopX mit losetup, für fiile, die kleiner als 512 Bytes ist es gibt uns folgende Warnung:

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

Für Datei, die die Größe kann nicht durch 512 geteilt werden:

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

wurde diese Warnung seit util-linux ver 2.22 in this commit