read(3) のマニュアルページで定義された動作が見つかりません。私の考えでは、エラーが発生したり0を返すようです。しかし、誰かが定義された動作を確認できれば良いでしょう。または、アクションがどこかに定義されていないと指定されている場合でも、これを指定することをお勧めします。
答え1
定義によると、これは起こり得ません(少なくともPOSIX.1-2008それから)。nbyte
パラメータは、符号なし整数型のread()
aです。size_t
答え2
関数のプロトタイプを考えてみてくださいread
。
ssize_t read(int fd, void *buf, size_t count);
count
引数に符号がないので、負の数を渡そうとsize_t
すると、次のようになります。read(fd, buf, -20)
(そして2のメンテナンスマシンを実行しています;-))これは成功戻り値の範囲を超えて非常に大きいと解釈されます。これはcount
a で読み取ったread()
バイト数を返します。ssize_t
兆候同じサイズの整数ですsize_t
。
この場合、次の条項が適用されます。
nbyte値が大きい場合、
{SSIZE_MAX}
結果は実装に基づいて定義されます。
この時間はオペレーティングシステム:
Linuxでは、
read()
(および同様のシステムコール)最大0x7ffff000
(2,147,479,552
)バイトを送信して、送信された実際のバイト数を返します。 (32ビットシステムと64ビットシステムの両方に対応します。)
実際には、プロセスのアドレス空間内でバイトから始まり、バイト単位に拡張されるメモリブロックを合わせることは不可能であるため、read()
より大きな場合が生成さcount
れます。SSIZE_MAX
EFAULT
buf
count
*bsdから:
read()
pread()
次のエラーが返されることがあります。
[EINVAL]
nバイトより大きいSSIZE_MAX
ソラリスでも同様です。
EINVAL
nbyteパラメータがオーバーフローしました
ssize_t
。
注:openbsdマンページ成功時に負の値を返すことができるシステムについて言及してくださいread()
。そのようなシステムを知っている場合は、ここまたはコメントにこれに関する情報を追加してください。