![쓰기 중 복사를 사용하여 수정되는 파일을 읽는 가장 좋은 방법은 무엇입니까?](https://linux55.com/image/154774/%EC%93%B0%EA%B8%B0%20%EC%A4%91%20%EB%B3%B5%EC%82%AC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%88%98%EC%A0%95%EB%90%98%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9D%BD%EB%8A%94%20%EA%B0%80%EC%9E%A5%20%EC%A2%8B%EC%9D%80%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
항상 일관성이 필요한 데이터가 포함된 파일이 있습니다. 수정이 필요한 경우 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)
은 파일의 기본 경로가 다른 프로세스에 의해 비밀리에 변경되는 것, 즉 "심볼릭 링크 공격"을 방지한다는 것입니다.