C 언어에서 헤더와 본문처럼 나뉜 버퍼에 한 번의 읽기로 데이터를 채우려면 readv()를 쓸 수 있다.
작게 실행해 보기
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/uio.h>
int main(void) {
FILE *fp = tmpfile();
if (!fp)
return 1;
if (fputs("abcdef", fp) == EOF || fflush(fp) == EOF) {
fclose(fp);
return 1;
}
int fd = fileno(fp);
if (fd < 0) {
fclose(fp);
return 1;
}
if (lseek(fd, 0, SEEK_SET) < 0) {
fclose(fp);
return 1;
}
char a[4] = {0}, b[4] = {0};
struct iovec parts[] = {{a, 3}, {b, 3}};
ssize_t n = readv(fd, parts, 2);
if (n < 0) {
fclose(fp);
return 1;
}
printf("bytes=%zd first=%s second=%s\n", n, a, b);
if (fclose(fp) == EOF)
return 1;
return 0;
}한 번의 읽기가 abc와 def 두 버퍼로 나뉜다. iovec 개수 2와 실제 읽은 바이트 수 6은 다른 값이다.
반환값과 주의점
읽은 전체 바이트 수를 반환한다. 0은 EOF일 수 있고 오류는 -1이다.
iovec마다 시작 주소와 바이트 길이를 넣는다. 앞 버퍼부터 채워지며 반환 길이가 모든 버퍼의 합보다 작을 수 있다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기