C 언어에서 헤더와 본문을 하나의 임시 버퍼로 합치지 않고 순서대로 쓰고 싶을 때 writev()를 사용한다.
작게 실행해 보기
#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;
}
struct iovec parts[] = {{"AB", 2}, {"CD", 2}};
ssize_t n = writev(fd, parts, 2);
if (n < 0) {
fclose(fp);
return 1;
}
printf("written=%zd\n", n);
if (fclose(fp) == EOF)
return 1;
return 0;
}두 버퍼를 ABCD 순서로 이어 기록한다. 반환값은 iovec 항목 수가 아니라 전체 바이트 수다.
반환값과 주의점
기록한 전체 바이트 수를 반환하고 오류는 -1이다. 배열 항목 개수가 반환되는 것은 아니다.
iovec 배열 순서대로 데이터를 기록한다. 부분 쓰기에서는 어느 버퍼의 어느 위치까지 기록했는지 계산해야 한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기