2017-02-11 2 views
-5

Я программирую на C++ и обнаружил, что pread работает очень интересно.Почему pread не гарантирует, что он считывает все указанные байты?

pread() возвращает количество прочитанных байтов. Возвращаемое количество прочитанных байтов может отличаться от указанного количества байтов, предназначенных для чтения.

Почему pread не гарантирует, что он прочитает все указанные байты?

Откуда это ограничение?

ответ

1

это может произойти, например, потому что меньше байт, на самом деле доступны прямо сейчас (возможно потому, что мы были близки к конечным из-файла, или потому, что мы читаем из трубы, или с терминала), или потому что read() был прерван сигналом. При ошибке возвращается -1, а errno - . В этом случае не указывается, изменяется ли файл (если есть).

из https://linux.die.net/man/2/read

2

Почему pread не гарантирует, что он прочитает все указанные байты?

Потому что он спроектирован так.

Как упоминается here:

Обратите внимание, что это не ошибка для успешного вызова для передачи меньше байт, чем запрошено (см прочитать (2) и писать (2)).

Таким образом, вы просто собираетесь снова вызвать эту функцию в этом случае.

+0

так вы знаете, почему? основные причины такого поведения? – syko

+2

@syko Это по дизайну. Это поддерживает интерфейсы ввода-вывода, которые предоставляют данные в виде доступных фрагментов. –

Смежные вопросы