%EA%B0%80%20%EC%A4%91%EB%8B%A8%EB%90%98%EB%A9%B4%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%82%98%EB%A8%B8%EC%A7%80%20%EB%B6%80%EB%B6%84%EC%9D%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%90%98%EB%82%98%EC%9A%94%3F.png)
나는 일반 파일 설명자에서 write(fd, buf, N)을 호출하고 있습니다.
호출 전의 파일 포인터는 파일의 시작이나 끝이 아니라 파일 중간 어딘가에 있습니다.
그런 다음 정전으로 인해 통화가 중단됩니다(또는 작업이 종료됨). 파일에서 N 바이트 전후의 데이터에 어떤 일이 발생하는지 보장할 수 있습니까? 변경되지 않은 상태로 유지된다는 보장이 있나요?
답변1
두 가지 다른 문제가 있습니다.
- 글쓰기 도중 전원이 꺼지면 어떻게 되나요?
전원이 꺼지면 어떤 일이 일어날지 보장할 수 없습니다. 전체 파일 시스템이 손실될 수도 있습니다.
그러나 몇 가지 전형적인 행동이 있습니다. 파일 시스템이 쓰기 영역에 새 블록을 할당하는 경우 정전 중에 새 블록에 대한 파일 시스템 메타데이터가 기록되지 않을 수 있으며 파일이 손실되거나 잘릴 수 있습니다. 그러나 파일 중간에 쓰는 중이고 블록이 이미 할당된 경우에는 문제가 없지만 디스크에 얼마나 많은 쓰기가 수행되었는지 보장할 수 없습니다. 일부일 수도 있고 전부일 수도 있고 전혀 아닐 수도 있습니다.
의견에서 지적했듯이 CoW 또는 네트워크 파일 시스템과 같은 특수 파일 시스템의 동작은 다를 수 있습니다. 저널링 파일 시스템은 이러한 문제를 보다 원활하게 복구하려고 시도합니다. 또한 RAID 어레이에는 정전 시 불완전한 쓰기를 저장하는 버퍼링 하드웨어가 있는 경우가 많습니다.
- 작성 도중에 프로세스가 종료되면 어떻게 되나요?
여기에는 두 가지 상황이 있습니다. write(2) 시스템 호출을 언급하는 경우 이는 대부분 원자적이며 프로세스가 실제로 종료되기 전에 완료되거나 전혀 시작되지 않을 수 있습니다. 어떤 경우에는 쓰기가 중단될 수 있지만 일반적으로 그렇지 않습니다.
stdio 버퍼링된 라이브러리 호출(예: fwrite(3))을 사용하려는 경우 프로세스가 종료될 때 기록되지 않는 기록되지 않은 버퍼링된 데이터가 프로세스에 있을 수 있습니다. 일반적으로 stdio는 데이터를 청크로 디스크에 버퍼링합니다. 버퍼에 완전한 청크가 있으면 write(2)를 호출합니다.