C++를 사용하여 일부 데이터를 바이너리 파일에 저장했습니다. 데이터를 저장한 지 2분 만에 갑자기 컴퓨터 전원이 꺼졌습니다. 컴퓨터를 다시 시작했을 때 데이터가 손상되었습니다. 바이너리 파일을 읽었을 때 모든 값은 이었습니다 0
. 이는 확실히 제가 파일에 쓴 값이 아닙니다.
갑작스러운 컴퓨터 전원 꺼짐으로 인해 내 파일의 데이터가 손상되었을 가능성이 있습니까? 아니면 한번 기록하고 디스크에 저장한 데이터는 갑작스러운 전원 차단 시에도 손상되지 않기 때문에 그럴 수 없도록 하기 위한 것입니까? 후자라면 문제에 대한 자세한 조사를 시작해야 하지만 다른 어떤 것도 잘못되었을 가능성은 전혀 없습니다. 이 프로그램은 매우 간단하고 2년 동안 사용해왔는데, 이 프로그램을 사용하여 작성된 파일의 데이터 손상을 본 것은 이번이 처음입니다.
PS 실제로 파일 저장이 완료되었습니다. 파일을 저장한 프로그램은 파일 I/O를 올바르게 관리합니다. 즉, 쓰기가 끝나면 파일을 닫습니다. 또한 전원이 꺼졌을 때 프로그램이 실행되지도 않았습니다. Windows 8.1에서 이런 일이 발생했습니다.
답변1
간단히 말하면, 데이터 파일을 생성할 때 운영 체제는 다음 세 가지 작업을 수행해야 합니다.
- 데이터를 포함하는 데 필요한 블록을 할당합니다.
- 해당 블록에 0을 쓰거나 읽으려고 하면 0이 표시되도록 합니다.
- 할당된 블록에 데이터를 씁니다.
2단계는 시스템 보안상의 요구 사항입니다. 할당된 블록에는 이전에 다른 사람의 데이터가 포함되어 있었을 수 있으며, 귀하가 이전 데이터를 읽을 수 있도록 허용하는 것은 시스템에 대한 보안 위반이 됩니다. 따라서 대신 0을 얻습니다. 2단계와 3단계 사이에 전원이 차단되면 데이터 대신 0이 표시됩니다.
기본 운영 체제 및 파일 시스템에 따라 프로그램 내에서 데이터를 디스크에 명시적으로 동기화하지 않는 한 3단계는 2단계 이후 임의로 오랜 시간이 걸릴 수 있습니다.
POSIX 호환 시스템에서는 다음을 호출하세요.fsync()귀하의 데이터가 영구 저장소에 도달했는지 확인하십시오.