
次の関数署名があります
ssize_t read(int fd, void *buf, size_t count);
マニュアルページに基づいて成功すると、戻り値が次の値より小さい可能性があることを理解していますが、計算ただし、戻り値は以下を超えることがあります。計算とにかく?
答え1
呼ぶread()
バックグラウンドで要求されたものよりも多くのデータを読み取ることができます(例えばリポジトリからブロック全体を読み取るか、次のブロックを最初に読み込みますread()
。いいえ要求されたよりも多くのデータが返されました(count
)。その場合、buf
通常はバイトだけがサイズ変更count
されるため、結果はバッファオーバーフローである可能性が高くなります。
POSIX(上記のリンクを参照)は、この制限を明示的に指定します。
正常に完了した後、バイト0より大きい、読む()更新されたファイルの最後のデータアクセスタイムスタンプをスタンプし、読み取ったバイト数を返す必要があります。この数字は以下より大きくすることはできません。バイト。
Linuxのマニュアルページそれほど明確ではありませんが、次のように言います。
read()
読んでくださいに従って計算バイトファイル記述子からFD 次に始まるバッファを入力してください。バッファー。
(ハイライトが追加されました.)
答え2
エラーが発生すると、read() は -1 を返し、符号なしで処理すると count よりほぼ確実に大きくなります。