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 устанавливается в соответствующее значение. В этом случае изменение позиции файла остаётся неопределённым (если это вообще происходило).

ОШИБКИ

EAGAIN
    Файловый дескриптор fd указывает на файл, не являющийся сокетом и который помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку.

EAGAIN или EWOULDBLOCK
    Файловый дескриптор fd указывает на сокет и он помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку. POSIX.1-2001 позволяет вернуть любую ошибку в этом случае и не требует, чтобы эти константы имели одинаковое значение, поэтому переносимое приложение должно проверять обе эти возможности.

EBADF
    fd не является допустимым файловым дескриптором или не открыт на чтение.

EFAULT
    buf находится за пределами доступного вам адресного пространства.

EINTR
    Вызов был прерван сигналом до того как были прочитаны данные; см. signal(7).

EINVAL
    fd связан с объектом, не приспособленным для чтения; илифайл был открыт с использованием флага O_DIRECT, и адрес, указанный в buf, значение, указанное в count или текущее смещение в файле, имеет недопустимое выравнивание.

EINVAL
    fd был создан вызовом timerfd_create(2), а в read() был передан неверный размер буфера; подробней см. в timerfd_create(2).

EIO Ошибка ввода/вывода. Например, это происходит когда процесс, находящийся в фоновой группе процессов, пытается выполнить чтение из своего управляющего tty, и игнорирует или блокирует сигнал SIGTTIN или же его группа процессов осталась без родителя. Это также может случиться, если произошла низкоуровневая ошибка ввода-вывода при чтения с диска или ленты.

EISDIR
    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)