쓰기 중 복사를 사용하여 수정되는 파일을 읽는 가장 좋은 방법은 무엇입니까?

쓰기 중 복사를 사용하여 수정되는 파일을 읽는 가장 좋은 방법은 무엇입니까?

항상 일관성이 필요한 데이터가 포함된 파일이 있습니다. 수정해야 할 경우 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 공격").

관련 정보