벡터 입출력은 한번의 시스템 콜을 사용해서 여러 개의 버퍼 벡터에 쓰거나 여러 개의 버퍼 벡터로 읽어 들일 때 사용하는 입출력 메서드다. 벡터 입출력은 선형 입출력 메서드에 비해 다음과 같은 장점을 가지고 있다.
#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);
iovec 구조체는 세그먼트라고 하는 독립적으로 분리된 버퍼를 나타낸다. readv()와 writev() 함수 모두 iov[0]부터 시작해서 iov[count-1]까지 세그먼트 순서대로 동작한다.
#include <sys/uio.h>
struct iovec {
void *iov_base; // 버퍼의 시작 포인터
size_t iov_len // 버퍼 크기 (바이트)
readv()와 writev()는 호출이 성공했을 때 일걱나 쓴 바이트 개수를 반환한다. 이 반환값은 반드시 count * iov_len 값과 같아야 한다. 에러가 발생하면 -1을 반환하고 errno를 적절한 값으로 설정한다.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h>
int main()
{
struct iovec iov[3];
ssize_t nr;
int fd, i;
char *buf[] = {
"the one.\n",
"the two2.\n",
"the three3.\n",
}
fd = open("text.txt", O_WRONLY | O_CREAT | O_TRUNC);
for (i = 0; i < 3; i++)
{
iov[i].iov_base = buf[i];
iov[i].iov_len = strlen(buf[i]) + 1;
}
nr = writev(fd, iov, 3);
if (nr == -1)
{
perror("writev");
return 1;
}
printf("wrote %d bytes\n", nr);
if (close(fd))
{
perror("close");
return 1;
}
return 0;
}