9

write システム コールのプロトタイプは次のとおりです。

ssize_t write(int fd, const void *buf, size_t count);

count パラメータは符号なしで、戻り値は符号付きです。

ヘルプページには次のように書かれています:

成功すると、書き込まれたバイト数が返されます (ゼロは何も書き込まれていないことを示します)。エラーの場合は -1 が返され、errno適切に設定されます。

ただし、count パラメーターの制限については言及されていません。count が より大きい場合の動作についてはまだ述べていませんSSIZE_MAX

write が汎用デバイス/ファイル/その他に使用できるシステム コールであることを考慮すると、デバイスが SSIZE_MAX より大きい書き込み操作をサポートしている場合、戻り値の型は実際の書き込みバイト数を処理できません。

符号なしのバイト数を渡して、結果として符号付きのバイト数を返すことができるのは、私には意味がありません。署名された番号を渡さないのはなぜですか?

エラーが発生しやすい書き込み関数のプロトタイプのように感じられるか、少なくともパスに穴が残る可能性があります。

誰かがそれについての詳細を知っていますか、またはどこでこの情報を見つけることができますか?

4

3 に答える 3

2

ハードリミットはないと思います。それは何fdを指すかによって異なります。たとえば、ファイルシステム上のファイルの場合、「最大ファイルサイズ制限」を超えるとファイルシステムドライバーが停止し、EFBIG エラーが返されます。

EFBIG実装で定義された最大ファイル サイズまたはプロセス ファイル サイズ制限を超えるファイルを書き込もうとしました。

于 2012-09-21T13:52:15.063 に答える
1

ググった:

nbyte の値が{SSIZE_MAX}より大きい場合、結果は実装定義です。

ソース: http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html

于 2012-09-21T14:30:55.853 に答える
0

システムは関数に与えるバイト数を割り当てることを覚えていると思います。確信はないけど。たぶん、size_tとssize_tのマニュアルページを試してみてください。

于 2012-09-21T13:45:08.423 に答える