Прочие коды ошибки относятся к программным ошибкам или (как ЕЮ) к проблемам
на низком уровне. Возможные значения еггпо после сбоя вызова readO
включают в себя:
EBADF
Данный файловый дескриптор недопустим или не открыт для чтения.
EFAULT
Указатель, предоставленный вызову при помощи buf, находится за пределами
адресного пространства вызывающего процесса.
EINVAL
Файловый дескриптор соответствует объекту, пс допускающему чтение.
ЕЮ
Произошла низкоуровневая ошибка ввода-вывода.
Лимиты размера для вызова read()
Типы size_t и ss ize t определены в POSIX. Тип s ize t используется для хранения
значений, обозначающих размеры, в байтах. Тип ss ize t - это версия
size t со знаком (отрицательные значения обозначают ошибки). В 32-разряд-
ных системах дополнительные типы С - это обычно unsigned in t и in t соответственно.
Так как эти два типа часто используются вместе, потенциально меньший
диапазон s s ize t ограничивает диапазон s ize t.
Максимальное значение типа s ize t - это SIZE MAX; максимальное значение
типа ssize_t - SSIZE_MAX. Если значение Теп больше SSIZE_MAX, то результаты вызова
read() не определены. В большинстве систем Linux размер SSIZE MAX равен
L0NG MAX, то есть 0 x 7 f ffffff на 32-разрядной машине. Это относительно много
для одной операции считывания, но все равно не стоит забывать об этом ограничении.
Если вы используете показанный выше цикл считывания для обычного
объемного считывания, то стоит добавлять подобные строки:
if (len > SSIZEMAX)
len = SSIZF_MAX.
Вызов readO с аргументом len, равным нулю, приводит к тому, что немедленно
возвращается значение, равное 0.