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

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

항상 일관성이 필요한 데이터가 포함된 파일이 있습니다. 수정이 필요한 경우 Process 1새 파일을 만들고 수정 사항을 새 파일에 쓴 다음 를 mv사용하여 새 파일의 이름을 이전 파일 이름으로 바꿉니다.

Process 2이 파일을 읽어야 하는 다른 프로세스가 있는 경우 이 프로세스가 항상 일관된 파일을 읽도록 하려면 어떻게 해야 합니까? 즉, 읽기 프로세스 mv중에 Process 1데이터 손상을 일으키지 않고 있습니까?

답변1

이전 파일과 동일한 파일 시스템에 새 파일을 생성하고 rename(2)원자성이 보장되는 함수를 사용하여 이를 보장할 수 있습니다[1].

Unix 파일 시스템에서는 rename(2)디렉토리 항목에만 작용합니다. 원래 디렉토리 항목이 가리키는 inode에 대한 열린 핸들이 있는 프로세스는 계속해서 이전 파일을 읽거나 씁니다.

일반적으로 이 mv(1)유틸리티는 을 호출 rename(2)하지만, 실패할 경우 삭제+복사 또는 기타 의심스러운 비원자적 작업으로 대체될 수 있습니다 rename(2).

동일한 파일 시스템에 있는 두 개의 파일이 rename(2)성공을 보장하지 않을 수도 있습니다. 일부 파일 시스템은 9pfs이름 바꾸기 작업을 지원하지 않으므로 어떻게든 수행해야 합니다.

[1] 더 좋은 점 renameat(2)은 파일의 기본 경로가 다른 프로세스에 의해 비밀리에 변경되는 것, 즉 "심볼릭 링크 공격"을 방지한다는 것입니다.

관련 정보