nbyte < 0の場合、read(3)はどのように処理しますか?

nbyte < 0の場合、read(3)はどのように処理しますか?

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のメンテナンスマシンを実行しています;-))これは成功戻り値の範囲を超えて非常に大きいと解釈されます。これはcounta で読み取ったread()バイト数を返します。ssize_t兆候同じサイズの整数ですsize_t

この場合、次の条項が適用されます。

nbyte値が大きい場合、{SSIZE_MAX}結果は実装に基づいて定義されます。

この時間はオペレーティングシステム:

Linuxでは、 read() (および同様のシステムコール)最大 0x7ffff0002,147,479,552)バイトを送信して、送信された実際のバイト数を返します。 (32ビットシステムと64ビットシステムの両方に対応します。)

実際には、プロセスのアドレス空間内でバイトから始まり、バイト単位に拡張されるメモリブロックを合わせることは不可能であるため、read()より大きな場合が生成さcountれます。SSIZE_MAXEFAULTbufcount

*bsdから:

read()pread()次のエラーが返されることがあります。

[EINVAL] nバイトより大きいSSIZE_MAX

ソラリスでも同様です。

EINVAL

nbyteパラメータがオーバーフローしましたssize_t

注:openbsdマンページ成功時に負の値を返すことができるシステムについて言及してくださいread()。そのようなシステムを知っている場合は、ここまたはコメントにこれに関する情報を追加してください。

関連情報