stdio.hのBUFSIZとblockdevのブロックサイズの違いは何ですか?

stdio.hのBUFSIZとblockdevのブロックサイズの違いは何ですか?

私が読んでいるUnixプログラミング環境(1984).第7章(Unixシステムコール)では、著者は次のように言います。

読み書きするバイト数に制限はありませんが、最も一般的な値は1(一度に1文字)です...ディスクのブロックサイズは最も一般的に512または512です。 1024バイト。(<stdio.h>のBUFSIZパラメータにこの値があります。)

私はこれを確認するための簡単なプログラムを書いた。

#include <stdio.h>

int main()
{
    printf("The BUFSIZ is %d\n", BUFSIZ);
    return 0;
}

マイシステムから返す(Linux Mint)8192。本で述べた「512や1024」よりはるかに多くの数字だ。私はこれが歴史的状況の違いに基づいているべきだと思います。

好奇心が強いので、私はCプログラムを直接書かずにこのブロックサイズを見つける別の方法を見つけ、次のようなものを見つけましたblockdev

me@mint:~/src/c/unixprogenvbk$ sudo blockdev --getbsz /dev/sda1
4096

BUFSIZ値は8192ですが、なぜ4096ですか?これは実際には2つの異なるものですか?

ベストアンサー1

その詩がどこから出てくるのかは分かりませんが、Unixプログラミング環境意味はありますが、BUFSIZディスクブロックサイズとは何の関係もないと思います。不可能で一定で、BUFSIZディスクごとに異なるブロックサイズを持つことができます(NVMeやNVDIMMなどの一部のデバイスはブロックサイズの変更もサポートしています)。

私はこの定義が好きですglibc ドキュメントもっと:

このマクロの値は、setvbufのサイズパラメータとして使用するのに適した整数定数式です。この値は少なくとも256が保証されます。 BUFSIZの値は、ストリーミングI / O効率を向上させるためにシステムごとに選択されます。したがって、setvbufを呼び出すときは、バッファサイズとしてBUFSIZを使用するのが最善です。

しかし、toに設定された定数だけがstdio.hあり、なぜ文書が各システムに対して選択されたのかを知らない。BUFSIZ8192

blockdevioctlを使用してBLKBSZGET指定されたデバイスのブロックサイズを取得するので、これはディスクの実際のブロックサイズです。

おすすめ記事