STDINから指定されたバイト数を読み取る必要があるCGIを作成したいと思います。私の考えは次のとおりです。
dd bs=$CONTENT_LENGTH count=1
しかし、ブロックサイズがRAM以外のものによって制限されるかどうかを知りたいです。
$ dd bs=1000000000000
dd: memory exhausted by input buffer of size 1000000000000 bytes (931 GiB)
GNU coreutils のマニュアルページに制限はありません。
ベストアンサー1
POSIX仕様dd
最大値を明示的に指定しないでください。しかし、いくつかの制限があります。
- 指定された値を格納するために使用されるデータ型は、次のようになると予想されます。
size_t
これは、読み取るバイト数の型であるためです。read
機能; read
制限も決まっています。SSIZE_MAX
;- Linuxでは、
read
最大2,147,479,552バイトのみ転送できます。それでも。
64ビットプラットフォームでは、size_t
長さは64ビットです。また、符号がないため、2 64dd
- 1より大きい値を指定すると失敗します。
$ dd if=/dev/zero of=/dev/null bs=18446744073709551616
dd: invalid number: ‘18446744073709551616’
64ビットx86 Linuxでは、入力制限であるSSIZE_MAX
0x7ffffffffffffffffffL(実行して確認)です。echo SSIZE_MAX | gcc -include limits.h -E -
$ dd if=/dev/zero of=/dev/null bs=9223372036854775808
dd: invalid number: ‘9223372036854775808’: Value too large for defined data type
$ dd if=/dev/zero of=/dev/null bs=9223372036854775807
dd: memory exhausted by input buffer of size 9223372036854775807 bytes (8.0 EiB)
許容値が見つかった場合、次の制限は割り当て可能なメモリ量です。dd
バッファを読み込む前にバッファを割り当てる必要があるからです。
割り当て可能な値が見つかると、read
限界に達します(Linuxや同様の制限がある他のシステムの場合)。GNUを使用dd
して指定しない限りiflag=fullblock
:
$ dd if=/dev/zero of=ddtest bs=4294967296 count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB, 2.0 GiB) copied, 38.3037 s, 56.1 MB/s
(231dd
バイト未満のコピー、つまり上記のLinuxの制限は、私が必要とするものの半分にもなりません。
上記のQ&Aで説明されているように、fullblock
1より大きい値については、いかなる場合でもすべての入力データを確実にコピーする必要があります。bs