НАЗВАНИЕ¶
read - читает из
файлового
дескриптора
КРАТКОЕ
ОПИСАНИЕ¶
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ОПИСАНИЕ¶
read() пытается
читать из
файлового
дескриптора
fd байты в
количестве
count в буфер,
начинающийся
по адресу
buf.
Если
count равен
нулю, то
read()
возвращает
ноль и
ничего не
делает. Если
count больше, чем
SSIZE_MAX, то
результат
неопределен.
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ¶
При успешном
завершении
возвращается
количество
байт,
которые были
прочитаны
(ноль
означает
конец файла),
а позиция в
файле
увеличивается
на это
значение.
Если
количество
прочитанных
байт меньше,
чем
количество
запрошенных,
то это не
считается
ошибкой:
например, мы
могли читать
вблизи конца
файла, или же
из трубы, или
с терминала,
или же
read() был
прерван
сигналом. В
случае
ошибки
возвращается
-1, а
errno
устанавливается
должным
образом. В
этом случае
позиция
файла
неопределена.
ОШИБКИ¶
- EINTR
- Системный
вызов был
прерван
сигналом до
того, как был
прочитан
хотя бы
байт.
- EAGAIN
- Был
запрошен
неблокирующий
ввод-вывод с
помощью O_NONBLOCK,
и нет данных,
немедленно
доступных
для чтения.
- 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
может быть
достигнута
запретом
кэширования
атрибутов,
но в
большинстве
случаев это
увеличит
нагрузку на
сервер и
уменьшит
производительность.
СМОТРИ
ТАКЖЕ¶
readdir(2),
write(2),
fcntl(2),
close(2),
lseek(2),
select(2),
readlink(2),
ioctl(2),
fread(3).
ПЕРЕВОД¶
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999