항상 일관성이 필요한 데이터가 포함된 파일이 있습니다. 수정해야 할 경우 Process 1
새 파일을 만들고 수정 사항이 포함된 새 파일을 쓴 다음 mv
새 파일의 이름을 이전 파일 이름으로 바꾸는 데 사용합니다.
이 파일을 읽어야 하는 다른 프로세스가 있는 경우 Process 2
이 프로세스가 항상 일관된 파일을 읽는다는 것을 어떻게 보장할 수 있습니까? 즉, mv
읽는 Process 1
동안 으로 인해 데이터가 손상되지 않을 수 있습니까?
답변1
이전 파일과 동일한 파일 시스템에 새 파일을 생성하고 rename(2)
원자성을 보장하는 [1] 함수를 사용하면 이를 보장할 수 있습니다.
Unix 파일 시스템에서는 rename(2)
디렉토리 항목에만 작동하며 원래 dir 항목이 가리키는 inode에 대한 열린 핸들이 있는 프로세스에는 영향을 미치지 않습니다. 해당 프로세스는 계속해서 이전 파일을 읽거나 씁니다.
일반적으로 mv(1)
유틸리티는 를 호출 rename(2)
하지만 실패할 경우 제거 + 복사 또는 기타 모호한 비원자적 작업으로 대체될 수 있습니다 rename(2)
.
동일한 파일 시스템에 있는 두 파일이 성공을 보장하지 않을 수도 있습니다 rename(2)
. 이름 바꾸기 작업을 지원하지 않는 파일 시스템이 있으므로 9pfs
어떤 방식으로든 제작해야 합니다.
[1] 또는 그보다 더 나은 방법은 renameat(2)
파일의 주요 경로가 다른 프로세스에서 은밀하게 변경되는 것을 방지합니다(예: "symlink 공격").