C 언어에서 파일 내용과 그 내용을 읽는 데 필요한 메타데이터를 동기화하려면 fdatasync()를 쓴다.
작게 실행해 보기
#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 (fdatasync(fd) < 0) {
fclose(fp);
return 1;
}
puts("data synced");
if (fclose(fp) == EOF)
return 1;
return 0;
}사용자 공간 버퍼를 내린 뒤 파일 데이터 동기화를 요청한다. 함수 호출 시간을 벤치마크하는 예제는 아니다.
반환값과 주의점
성공은 0, 실패는 -1이다. 사용자 공간 FILE 버퍼는 먼저 fflush() 등으로 내려보내야 한다.
파일 크기처럼 데이터 접근에 필요한 정보는 동기화하지만 마지막 접근 시간 같은 정보까지 모두 기록할 필요는 없다. fsync()와 목적을 구분한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기