read()
пытается записать
count
байтов файлового описателя
fd
в буфер, адрес которого начинается с
buf.
Если количество
count
равно нулю, то
read()
возвращает это нулевое значение и завершает свою работу. Если
count
больше, чем
SSIZE_MAX,
то результат не может быть определен.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При успешном завершении вызова возвращается количество байтов, которые были
считаны (нулевое значение означает конец файла),
а позиция файла увеличивается на это значение.
Если количество прочитанных байтов меньше, чем
количество запрошенных, то это не считается ошибкой: например,
данные могли быть почти в конце файла, в канале, на терминале, или
read()
был прерван сигналом. В случае ошибки возвращаемое значение равно
-1, а переменной
errno
присваивается номер ошибки. В этом случае позиция файла
не определена.
НАЙДЕННЫЕ ОШИБКИ
EINTR
Системный вызов был прерван сигналом до того, как был прочитан хотя бы один байт.
EAGAIN
При помощи
O_NONBLOCK
был выбран неблокирующий (non-blocking) ввод-вывод,
и нет данных, доступных для чтения в данный момент.
EIO
Ошибка ввода-вывода. Это может произойти, например, если процесс,
находящийся в группе фоновых процессов, пытается читать данные на
контрольном терминале, игнорирует или блокирует сигнал
SIGTTIN,
или же его группа осталась без родителя. Это может также
случиться, если произошла низкоуровневая ошибка ввода-вывода при
считывании данных с диска или ленты.
EISDIR
fd
указывает на каталог.
EBADF
fd
является неверным файловым описателем или не открыт для чтения.
EINVAL
fd
связан с объектом, не предназначенным для чтения.
EFAULT
buf
указывает на каталог за пределами доступного адресного пространства.
Могут также возникнуть другие ошибки (в зависимости от объекта,
связанного с
fd).
POSIX позволяет системному вызову
read,
который был прерван после чтения первого блока запрошенных данных,
вернуть значение -1 (устанавливая значение переменной
errno
равным EINTR) или количество уже прочитанных байтов.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
НАЙДЕННЫЕ ОШИБКИ И ОГРАНИЧЕНИЯ
В файловых системах NFS чтение небольших порций данных обновляет
значение временного штампа только в первый раз. Это вызвано кэшированием
атрибутов со стороны клиента: большинство клиентов NFS (если не все)
предоставляют серверу право обновлять время доступа, а запросы на чтение,
которые удовлетворяются из клиентского кэша, не вызывают обновления
времени доступа, потому что данные не считываются с сервера. Семантика
UNIX может быть получена путем запрета кэширования атрибутов, но в
большинстве случаев это увеличит нагрузку на сервер и уменьшит
производительность.
Много файловых систем и дисков создавались достаточно быстрыми для того,
чтобы в использовании
O_NONBLOCK
не было необходимости. Поэтому иногда O_NONBLOCK может быть недоступно
на некоторых файлах и/или дисках.