본문 바로가기
Programming/C++

fsync() 와 sync() 차이점 및 활용법(linux, Qt5)

by AUTORI 2021. 10. 24.

파일을 새로 만들고 저장하면, 내 하드 디스크에 바로 그 즉시 저장될까? 정답은 아니다. 실제로 우리가 새로 만든 파일은 우선 메모리 버퍼에 저장되며 운영체제(커널)가 판단하여 일정 시간이 지난 뒤 하드 디스크에 저장한다. 파일을 복사 또는 저장 후 컴퓨터 전원을 바로 끊어버리는 경우, 혹은 용량이 아주 큰 파일을 USB로 복사하고 추출 버튼을 누르지 않은 채 곧바로 USB를 빼는 경우, 파일이 깨지거나 복사가 되지 않을 수 있다. 아직 버퍼에 남아 있는 상태에서 물리적으로 연결을 끊으면 저장이 되지 않는다.

 

 

 

만약 파일 생성 및 복사 후 하드 디스크에 곧바로 저장하고 싶다면 fsync() 함수 또는 sync() 함수를 사용하면 된다.

1. fsync()

변경 파일(data와 metadata)을 하드 디스크에 저장되도록 요청하며, data와 metadat가 저장이 될 때까지 기다린다.

 

QFile f(filePath);
QString contents = "test";
if( !f.open(QIODevice::WriteOnly | QIODevice::Truncate) ){
  return false;
}
if( f.write(contents.toUitf() ) > -1 ){
  //SUCCESS
  f.flush();
  fsync( f.handle() );
}
f.close();

 

2. sync()

현재 버퍼에 있는 모든 파일들을 디스크에 저장하도록 요청한다. 요청만 할 뿐, 실제 저장 완료될 때까지 기다리진 않는다. 따라서 자주 사용하게 되면 시스템 성능에 영향을 미칠 수 있다. 꼭 필요한 상황에서만 사용하는 것이 좋다.

 

QFile f(filePath);
QString contents = "test";
if( !f.open( QIODevice::WriteOnly | QIODevice::Truncate) ){
  return false;
}
if( f.write(contents.toUitf()) > -1 ){
    //SUCCESS
}  
f.close();
sync();

 

댓글