read - cчитывает данные файлового описателя
НАЗВАНИЕread - cчитывает данные файлового описателя
СИНТАКСИС
#include
ssize_t read(int fd, void *buf, size_t count);
ОПИСАНИЕ
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 может быть
недоступно на некоторых файлах и/или дисках.