readv()

Считать последовательность байт из файла

Прототип:

#include <sys/uio.h>
ssize_t readv( int fildes,
const iov_t *iov,
int iovcnt );

Аргументы:

fildes
Дескриптор файла, из которого требуется читать.
iov
Массив объектов iov_t, где функция может хранить считаннные данные.
iovcnt
Количество записей в массиве iov. Максимальное количество записей - UIO_MAXIOV.

Библиотека:

libc

Описание:

Функция readv() пытается читать из файла, связанного с дескриптором открытого файла fildes, помещая данные в буферы iovcnt, указанные членами массива iov: iov[0], iov[1], ..., iov[iovcnt - 1].

В обычном файле или другом файле, в котором возможно перемещение, readv() начинает с позиции в файле, заданной смещением файла, связанным с fildes. Перед успешным завершением readv() смещение файла увеличивается на количество фактически прочитанных байт.

Функция readv() всегда полностью заполняет один буфер перед переходом к следующему.


Note: Вызов readv() игнорирует рекомендательные блокировки, которые могли быть установлены функцией fcntl().

В файле, в котором невозможно перемещение, readv() начинает с текущей позиции.

При успешном завершении readv(), возвращаемое значение - это количество байт, фактически прочитанных и помещенных в буфер. Это число никогда не будет больше, чем объединенные размеры буферов iov, хотя оно может быть меньше по одной из следующих причин:

Если readv() прерывается сигналом перед чтением каких-либо данных, она возвращает значение -1 и устанавливает errno в значение EINTR. Однако, если функция readv() прерывается сигналом после успешного чтения некоторых данных, она возвращает количество прочитанных байт.

Никакие данные не передаются за текущий конец файла. Если начальная позиция находится в конце файла или после него, readv() возвращает ноль. Если файл является специальным файлом устройства, результат последующих вызовов readv() будет работать в зависимости от текущего состояния устройства (то есть конец файла является временным).

При попытке чтения из пустого канала или FIFO:

  1. Если ни у одного процесса нет канала, открытого для записи, readv() возвращает 0, чтобы указать конец файла.

  2. Если у процесса открыт канал для записи и установлен O_NONBLOCK, readv() возвращает -1 и устанавливает для errno значение EAGAIN.

  3. Если у процесса есть канал, открытый для записи, и O_NONBLOCK очищен, read() блокируется до тех пор, пока некоторые данные не будут записаны, или канал будет закрыт всеми процессами, открывшими его для записи.

При попытке чтения из файла (кроме канала или FIFO), который поддерживает неблокирующее чтение и в настоящее время не имеет доступных данных:

  1. Если установлен флаг O_NONBLOCK, readv() возвращает -1 и устанавливает для errno значение EAGAIN.

  2. Если O_NONBLOCK очищен, readv() блокируется до тех пор, пока не станет доступна часть данных.

  3. Флаг O_NONBLOCK не действует, если часть данных доступна.

При вызове readv() для части файла до конца файла, которая не была записана, она возвращает байты с нулевым значением.

Если readv() завершается успешно, поле st_atime файла помечается для обновления.

Возвращаемое значение:

Число считанных байт данных. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EAGAIN
Флаг O_NONBLOCK установлен для дескриптора файла, и процесс будет задержан в операции чтения.
EBADF
Дескриптор файла, fildes, не является допустимым дескриптором файла, открытым для чтения.
EINTR
Операция чтения была прервана сигналом, и либо данные не были переданы, либо менеджер ресурсов, ответственный за этот файл, не сообщает о частичной передаче.
EINVAL
Аргумент iovcnt меньше или равен 0 или больше, чем UIO_MAXIOV.
EIO
Произошла физическая ошибка ввода/вывода (например, битый блок на диске). Точное значение зависит от устройства.
ENOSYS
Функция readv() не реализована для файловой системы, указанной в filedes.
EOVERFLOW
Файл является обычным файлом, и делается попытка чтения с максимальным смещением, связанным с файлом, или за его пределами.

Классификация:

POSIX 1003.1 X/Open Systems Interfaces Extension

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

iov_t, close(), creat(), dup(), dup2(), errno, fcntl(), lseek(), open(), pipe(), read(), readblock(), select(), write(), writev()




Предыдущий раздел: Описание API системной библиотеки