Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 파일 디스크립터(fd)를 사용해 파일을 디스크에 강제로 쓰는 방법

파이썬에서 열려 있는 파일의 내용을 즉시 디스크에 반영하려면 운영체제 수준의 동기화 함수를 사용해야 합니다. 대표적인 방법은 os.fsync()os.fdatasync() 두 가지입니다.

1. fdatasync(fd) — 메타데이터를 제외한 데이터만 동기화

os.fdatasync(fd)는 파일 디스크립터 fd가 가리키는 파일의 데이터를 디스크에 강제로 기록합니다. 이 함수는 파일 크기나 수정 시간 같은 메타데이터의 갱신까지는 강제하지 않습니다. 또한 이 함수는 Unix 계열 시스템에서만 사용할 수 있다는 점에 유의해야 합니다.

2. fsync(fd) — 크로스 플랫폼 동기화

더 범용적인(크로스 플랫폼) 해결책은 os.fsync(fd)를 사용하는 것입니다. 이 함수 역시 파일 디스크립터 fd가 가리키는 파일을 디스크에 강제로 기록하며, Unix에서는 네이티브 fsync() 함수를 호출하고, Windows에서는 MS의 _commit() 함수를 호출합니다. 따라서 운영체제에 관계없이 동일한 코드로 데이터를 안전하게 디스크에 반영할 수 있습니다.

예제 코드

import os

# 파일 열기
fd = os.open("foo.txt", os.O_RDWR | os.O_CREAT)

# 파일에 데이터 쓰기
os.write(fd, b"This is test")

# fsync()를 호출하여 버퍼의 내용을 디스크에 강제 기록
os.fsync(fd)

# 파일 포인터를 처음으로 이동한 뒤 다시 읽기
os.lseek(fd, 0, 0)
data = os.read(fd, 100)
print("Read String is : ", data.decode())

# 파일 닫기
os.close(fd)

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다:

Read String is :  This is test

정리

  • os.fsync(fd): 데이터와 메타데이터를 모두 디스크에 동기화하며, Unix와 Windows 모두에서 사용 가능합니다.
  • os.fdatasync(fd): 데이터만 동기화하고 메타데이터는 갱신하지 않으며, Unix 계열에서만 지원됩니다.

중요한 데이터를 다룰 때는 쓰기 작업 후 반드시 fsync()를 호출해야 정전이나 시스템 오류 발생 시에도 데이터 손실을 방지할 수 있습니다.