정전으로 인해 write()가 중단되면 파일의 나머지 부분은 어떻게 되나요?

정전으로 인해 write()가 중단되면 파일의 나머지 부분은 어떻게 되나요?

나는 일반 파일 설명자에서 write(fd, buf, N)을 호출하고 있습니다.

호출 전의 파일 포인터는 파일의 시작이나 끝이 아니라 파일 중간 어딘가에 있습니다.

그런 다음 정전으로 인해 통화가 중단됩니다(또는 작업이 종료됨). 파일에서 N 바이트 전후의 데이터에 어떤 일이 발생하는지 보장할 수 있습니까? 변경되지 않은 상태로 유지된다는 보장이 있나요?

답변1

두 가지 다른 문제가 있습니다.

  1. 글쓰기 도중 전원이 꺼지면 어떻게 되나요?

전원이 꺼지면 어떤 일이 일어날지 보장할 수 없습니다. 전체 파일 시스템이 손실될 수도 있습니다.

그러나 몇 가지 전형적인 행동이 있습니다. 파일 시스템이 쓰기 영역에 새 블록을 할당하는 경우 정전 중에 새 블록에 대한 파일 시스템 메타데이터가 기록되지 않을 수 있으며 파일이 손실되거나 잘릴 수 있습니다. 그러나 파일 중간에 쓰는 중이고 블록이 이미 할당된 경우에는 문제가 없지만 디스크에 얼마나 많은 쓰기가 수행되었는지 보장할 수 없습니다. 일부일 수도 있고 전부일 수도 있고 전혀 아닐 수도 있습니다.

의견에서 지적했듯이 CoW 또는 네트워크 파일 시스템과 같은 특수 파일 시스템의 동작은 다를 수 있습니다. 저널링 파일 시스템은 이러한 문제를 보다 원활하게 복구하려고 시도합니다. 또한 RAID 어레이에는 정전 시 불완전한 쓰기를 저장하는 버퍼링 하드웨어가 있는 경우가 많습니다.

  1. 작성 도중에 프로세스가 종료되면 어떻게 되나요?

여기에는 두 가지 상황이 있습니다. write(2) 시스템 호출을 언급하는 경우 이는 대부분 원자적이며 프로세스가 실제로 종료되기 전에 완료되거나 전혀 시작되지 않을 수 있습니다. 어떤 경우에는 쓰기가 중단될 수 있지만 일반적으로 그렇지 않습니다.

stdio 버퍼링된 라이브러리 호출(예: fwrite(3))을 사용하려는 경우 프로세스가 종료될 때 기록되지 않는 기록되지 않은 버퍼링된 데이터가 프로세스에 있을 수 있습니다. 일반적으로 stdio는 데이터를 청크로 디스크에 버퍼링합니다. 버퍼에 완전한 청크가 있으면 write(2)를 호출합니다.

관련 정보