C 언어에서 write()가 성공한 것과 데이터가 저장 장치에 반영된 것은 다르다. fsync()는 열린 파일의 변경을 동기화한다.
작게 실행해 보기
#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 (fsync(fd) < 0) {
fclose(fp);
return 1;
}
puts("synced");
if (fclose(fp) == EOF)
return 1;
return 0;
}fflush()로 FILE 버퍼를 먼저 내린 뒤 열린 임시 파일의 동기화를 요청한다. 사용자 버퍼와 커널의 기록 경계를 나눴다.
반환값과 주의점
동기화에 성공하면 0, 실패하면 -1이다. 저장 장치 오류가 이때 보고될 수 있다.
새 파일을 만든 뒤 이름까지 장애에 견디게 하려면 부모 디렉터리의 동기화도 따로 고려한다. 매 쓰기마다 부르면 저장 성능이 크게 떨어질 수 있다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기