fdatasync(2)

#include <unistd.h>

int fdatasync(int fd);

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

 

이 함수는 file의 meta정보(파일 access 정보 등)는 바로 동기화하지 않습니다. 

 

- fsync(2)와 차이점

file의 meta정보는 inode에 있고 데이터는 별도로 있기 때문에 inode를 찾아 갱신하는 데에도 시간이 걸리므로 fsync(2)보다 fdatasync(2)가 성능면에서 조금 낫습니다.

 

 

파라미터

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

 

RETURN

0
    - 정상적으로 데이터를 disk로 sync하였습니다.


-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(fdatasync(fd) == -1) {
        fprintf(stderr, "File sync error: %s\n", strerror(errno));
        return -1;
    }

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요