Книга: UNIX: разработка сетевых приложений
14.4. Функции readv и writev
14.4. Функции readv и writev
Эти две функции аналогичны функциям read
и write
, но readv
и writev
позволяют использовать для чтения или записи один или более буферов с помощью одного вызова функции. Эти операции называются операциями распределяющего чтения (scatter read) (поскольку вводимые данные распределяются по нескольким буферам приложения) и объединяющей записи (gather write) (поскольку данные из нескольких буферов объединяется для одной операции вывода).
#include <sys/uio.h>
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
Обе функции возвращают: количество считанных или записанных байтов, -1 в случае ошибки
Второй аргумент обеих функций — это указатель на массив структур iovec, для определения которого требуется включить заголовочный файл <sys/uio.h>
:
struct iovec {
void *iov_base; /* начальный адрес буфера */
size_t iov_len; /* размер буфера */
};
ПРИМЕЧАНИЕ
Типы данных элементов структуры iovec определяются POSIX. Вам могут встретиться реализации, определяющие iov_base как char*, a iov_len как int.
Существует некоторый предел числа элементов в массиве структур iovec, зависящий от реализации. Linux позволяет использовать до 1024 элементов, а HP-UD — до 2100. POSIX требует, чтобы константа IOV_MAX
определялась включением заголовочного файла <sys/uio.h>
и чтобы ее значение было не менее 16.
Функции readv
и writev
могут использоваться с любым дескриптором, а не только с сокетами. Кроме того, writev
является атомарной операцией. Для протокола, основанного на записях, такого как UDP, один вызов функции writev
генерирует одну дейтаграмму UDP.
Мы отметили одно использование функции writev
с параметром сокета TCP_NODELAY
в разделе 7.9. Мы сказали, что при записи с помощью функции write
4 байт и затем 396 байт может активизироваться алгоритм Нагла, и предпочтительное решение в данном случае заключается в вызове функции writev
для двух буферов.
- Основные системные функции для работы с файлами
- Функция read(2) и readv(2)
- Функции write(2) и writev(2)
- Глава 14 Дополнительные функции ввода-вывода
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности
- B1.7. Функции обработки ошибок