8

ブロックデバイスを読み書きするにはどうすればよいですか? 通常のファイルのように読み書きできると聞いたので、次のようにしてループデバイスをセットアップしました

sudo losetup /dev/loop4 ~/file

次に、ファイルでアプリを実行し、次にループデバイスを実行しました

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

ファイルは完全に実行されました。ループ デバイスは 0 バイトを読み取ります。どちらの場合も、FP==3 と off==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);
}
4

1 に答える 1

6

losetupファイルは 512 バイトのセクターにマップされているようです。ファイル サイズが 512 の倍数でない場合、残りは切り捨てられます。

ファイルを/dev/loopXwithlosetupにマッピングすると、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のver 2.22以降に追加されました

于 2014-10-24T09:01:21.560 に答える