Scroll to navigation

READ(2) Руководство программиста Linux READ(2)

ИМЯ

read - читает из файлового дескриптора

ОБЗОР

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

ОПИСАНИЕ

read() пытается прочитать count байт из файлового дескриптора fd в буфер, начинающийся по адресу buf.

Если значение count равно нулю, то read() возвращает ноль и ничего не делает. Еслиcount больше чем SSIZE_MAX, то результат не определён.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

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

ОШИБКИ

Файловый дескриптор fd указывает на файл, не являющийся сокетом и который помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку.
Файловый дескриптор fd указывает на сокет и он помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку. POSIX.1-2001 позволяет вернуть любую ошибку в этом случае и не требует, чтобы эти константы имели одинаковое значение, поэтому переносимое приложение должно проверять обе эти возможности.
fd не является допустимым файловым дескриптором или не открыт на чтение.
buf находится за пределами доступного вам адресного пространства.
Вызов был прерван сигналом до того как были прочитаны данные; см. signal(7).
fd связан с объектом, не приспособленным для чтения; илифайл был открыт с использованием флага O_DIRECT, и адрес, указанный в buf, значение, указанное в count или текущее смещение в файле, имеет недопустимое выравнивание.
fd был создан вызовом timerfd_create(2), а в read() был передан неверный размер буфера; подробней см. в timerfd_create(2).
Ошибка ввода/вывода. Например, это происходит когда процесс, находящийся в фоновой группе процессов, пытается выполнить чтение из своего управляющего tty, и игнорирует или блокирует сигнал SIGTTIN или же его группа процессов осталась без родителя. Это также может случиться, если произошла низкоуровневая ошибка ввода-вывода при чтения с диска или ленты.
fd указывает на каталог.

Могут также возникнуть другие ошибки, в зависимости от объекта, связанного с fd. POSIX позволяет системному вызову read(), который был прерван после чтения первого куска запрошенных данных, возвращать -1 (с errno, установленной в EINTR) или количество уже прочитанных байт.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.3BSD, POSIX.1-2001.

ЗАМЕЧАНИЯ

На файловых системах NFS чтение небольших порций данных обновляет отметки времени только в первый раз, последующие вызовы не делают этого. Это вызвано кэшированием атрибутов с клиентской стороны, потому что большинство (если не все) клиентов NFS предоставляют серверу обновлять st_atime (время последнего доступа), а запросы на чтение, которые удовлетворяются из клиентского кэша, не вызывают обновления st_atime, потому что данные не читаются с сервера. Семантика UNIX может быть достигнута запретом кэширования атрибутов на стороне клиента, но в большинстве случаев это увеличит нагрузку на сервер и снизит производительность.

Многие файловые системы и диски рассматриваются как достаточно быстрые и реализацию O_NONBLOCK считают ненужной. Поэтому O_NONBLOCK может быть недоступен на файлах и/или дисках.

СМОТРИТЕ ТАКЖЕ

close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)

2009-02-23 Linux