あなたが基本的に理解しているように、最初のバージョンは1024バイトの1つの読み込みをします、
そして、読み込みから戻ってきたバイト数は増えますが、
2番目のバージョンは1024バイトずつ1バイトずつ読み書きします。
通常のファイルをコピーするときは、ブロックサイズが大きくなります(その結果、入出力数が少なくなります)。
わずかに効率的かもしれません。これはおそらく本当です /dev/urandom
同様に。
しかし使用するときあなたは注意する必要があります dd
特殊ファイル(デバイスなど)
例えば、
dd if= (どんな入力でも) of = (磁気テープ装置) bs = 1024カウント= 1
1024バイトの1テープブロックを書き込みます。 dd … bs=1 count=1024
それぞれ1バイトの1024ブロックを書き込みます。
これらは同じではありません。
1024個の小さなブロックは、1個の大きなブロックよりもテープ上でより多くのスペースを占有します。
レコード間ギャップがあるため、テープの読み取りに問題が生じる可能性があります。
あなたが読んだなら、あなたの質問により関連している( if=
から) /dev/random
、
利用可能な高エントロピーバイト数だけを返します。
したがって、最初のバージョンでは、1024バイト未満になる可能性があります。
しかし、1バイトを読み込もうとしてエントロピープールが空の場合、読み取りはブロックされます(つまり、待ちます)
データが利用可能になるまで、2番目のバージョンでは1024バイトになることが保証されます。
(それは任意に長い時間がかかるかもしれませんが)。
テープドライブについて詳しく説明すると、
dd if= (適切な入力) of = (磁気テープ装置) bs = 512カウント= 2
512バイトのテープブロックを2つ書き込みます。その後
dd if= (磁気テープ装置) of = (なんでも) bs = 1024カウント= 1
最初のブロックだけを読むかもしれません。すなわち、最初の512バイトです。
そして(名前付き)パイプは同じ問題を示すかもしれません /dev/random
- 大量の読み込みでは、利用可能なバイト数だけが返されます。
つまり、最初のバージョンでも、1024バイト未満になる可能性があります。
しかし、一度に1バイトずつ読み込もうとすると、データが利用可能になるまで読み込みが待機するため、2番目のバージョンでは1024バイトになることが保証されます(または少なくともEOFまで読み込まれます)。