fsync(2)

#include <unistd.h>

int fsync(int fd);

write(2)함수를 통하여 쓰기를 하면, OS의 kernel이 buffer에 caching하고 write가 끝났다고 즉시 return합니다. 그러나 OS는 resource를 효율적으로 관리하기 위하여 kernel buffer에 있는 데이터를 kernel이 여유가 있거나 쓰기 최대 지연시간에 도달하면 kernel은 buffer에 있는 데이터를 실제 disk에 write를 합니다. fsync(2)는 kernel에 저장된 buffer를 시스템의 부하가 주더라도 무조건 disk에 write하라는 함수입니다.

 

- fdatasync(2)함수와의 차이점

fdatasync(2)는 data 부분만 동기화하고 meta 정보는 동기화는 바로 되지 않으나, fsync(2) 함수는 data 및 file의 meta 데이터도 함께 동기화를 수행합니다. 

 

 

파라미터

fd
    - open(2) 또는 creat(2) 등으로 open한 file descriptor
      반드시 쓰기(O_WRONLY 또는 O_RDWR)로 열려진 file descriptor여야 합니다.

 

RETURN

0
    - kernel buffer의 데이터를 disk에 정상적으로 write함.


-1
    -오류가 발생하였으며, 상세 오류 내용은 errno에 저장됩니다.

 EBADF : fd가 유효하지 않거나 쓰기 모드로 열리지 않음.
 EINVAL : fd가 동기화를 지원하지 않는 객체에 매핑됨
 EIO : 동기화중에 오류가 발생함.

 


활용 예제

 

Sample

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

    int fd;

    ......

    if((fd = open("myfile.dat", O_WRONLY | O_CREAT | O_TRUNC)) == -1) {
        fprintf(stderr, "File open error: %s\n", strerror(errno));
        return -1;
    }

    ......

    if(fsync(fd) == -1) {
        fprintf(stderr, "File sync error: %s\n", strerror(errno));
        return -1;
    }

    ......

 


see also :  sync(2) fdatasync(2)

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요