Векторный ввод/вывод – это способ ввода/вывода, когда системный вызов записывает или считывает данные из потока данных в вектор буферов.
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int count);
ssize_t writev(int fd, const struct iovec *iov, int count);
Первый системный вызов читает, а второй – записывает указанное число данных, находящееся в буферах, определенных вторым параметром в дескриптор первого параметра. В качестве третьего параметра используется количество сегментов, которое считывается или записывается (0<count<IOV_MAX=1024).
Каждый сегмент имеет такую структуру: первый параметр указывает на буфер, второй – на размер (количество байтов для обмена).
struct iovec
{ void *iov_base;
size_t iov_len; }
Пример использования векторного ввода/вывода:
#include <stdio.h>
#include <sys/types.h>
#include <fentf.h>
#include <string.h>
#include <sys/uio.h>
int main()
{
struct iovec iov[3];
ssize_t nr;
int fd;
char *buf[]={“AAAAAAAAA\n”, “BBBBB\n”, “CCCCCCC\n”};
fd=open(“fil1.txt”, O_WRONLY|O_CREAT|O_TRUNC);
if (fd==-1)
{ perror(“open”);
return(1); }
for (i=0; i<3; i++)
{ iov[i].iov_base=buf[i];
iov[i].iov_len=strlen(buf[i]); }
nr=writev(fd,iov,3);
|
|
if (nr==-1)
{ perror(“writev”);
return(1); }
printf(“Записаны %d байт \n”, nr);
if (close(fd))
{ perror(“close”);
return(1); }
}
Производится запись в файл трех строк массива. Для этого сначала открывается файл и проверяется, чтобы не было ошибок. Формируются сегменты данных (в первом поле указывается адрес, во втором – количество байт). Далее системный вызов writev записывает в буфера (указанный адрес) то количество, которое надо записать. Анализ возвращаемых значений проводится с помощью числа записанных байт (nr).
Применение функции векторного ввода/вывода предназначено для повышения производительности операций обмены за счет внутренней системной оптимизации выполняемых действий. Помимо этого первый оператор обмена может заменить несколько операторов ввода/вывода.