2010-07-15 3 views
2

POSIX 환경에서 디스크에서 파일을 제거하지만 파일을 제거하기 전에 체크섬을 계산하여 파일이 변경되지 않았는지 확인하려고합니다. 충분히 잠그고 있습니까? 내가 그것을 열고, 링크를 해제하고, 체크섬을 계산 한 다음 그것을 닫아야합니까 (OS가 아이 노드를 제거 할 수 있도록)? 다른 프로세스에 파일에 열린 파일 설명자가없는 것을 보장 할 수있는 방법이 있습니까?파일을 제거하려고 시도 할 때 파일이 변경되지 않도록하십시오.

약간의 컨텍스트를 제공하기 위해 코드는 호스트간에 파일 동기화를 수행하며 원격 호스트가 파일을 제거하지만 파일이 로컬로 변경되는 경우 데이터 손실의 기회가 있습니다.

답변

3

체크섬이 일치하지 않으면 멈추기 때문에 open, unlink, checksum, close의 제안은 주어진 파일에 대한 링크를 만드는 POSIX의 이식 가능한 방법이 없습니다. 파일 기술자에 의해). 더 나은 변형은 이름 바꾸기, 체크섬, 링크 해제, 닫기입니다. 체크섬이 일치하지 않으면 복사본의 이름을 바꾸거나 다시 실행 취소 할 수 있습니다. 그 동안에도 세 번째 프로그램이 파일을 다시 작성한 경우 수행 할 작업을 생각해야합니다.

POSIX는 협업 잠금 만 제공합니다. 파일을 수정할 수있는 프로그램을 제어 할 수있는 경우 잠금을 사용해야합니다. 그게 옵션이 아니라면, 당신은 자물쇠없이 붙어 있습니다.

어떤 프로세스가 파일을 열었는지 (또는 심지어 여부를) 알 수있는 이식성있는 방법은 없습니다. 대부분의 유닉스 시스템에서는 lsof이 표시되지만, 이는 보편적이지는 않으며 (프로그램이 lsof이 끝나면 파일을 열 수 있음) 불완전합니다 (NFS를 통해 파일을 내보내는 경우 활성 고객에 대해 알기).

rsync와 unison과 같은 다른 동기화 프로그램이 무엇을하는지 보면서 도움이 될 수 있습니다.

관련 문제