Векторный ввод/вывод

Векторный ввод/вывод – это способ ввода/вывода, когда системный вызов записывает или считывает данные из потока данных в вектор буферов.

#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).

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



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: