C 언어에서 파일 번호로 바이트를 보내거나 기록할 때 write()를 쓴다.
작게 실행해 보기
#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;
}
ssize_t n = write(fd, "XY", 2);
if (n < 0) {
fclose(fp);
return 1;
}
printf("written=%zd\n", n);
if (fclose(fp) == EOF)
return 1;
return 0;
}임시 파일의 처음 두 바이트를 덮어쓴다. 정상 반환값도 요청 길이와 비교해 부분 쓰기 여부를 확인한다.
반환값과 주의점
0 이상의 실제 기록 바이트 수를 반환한다. -1이면 errno로 오류를 확인한다.
성공해도 일부만 기록할 수 있다. 반환한 길이만큼 버퍼 위치를 옮겨 나머지를 다시 처리한다. 소켓이나 파이프가 닫혔을 때의 SIGPIPE도 별도로 고려한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기