다른 프로세스가 내용을 다시 쓰는 동안 파일을 읽은다고 가정합니다. 출력을 예측할 수 있습니까? 무슨 일이 일어날 지?
다른 프로세스가 내용을 다시 쓰는 동안 파일을 읽은다고 가정합니다. 출력을 예측할 수 있습니까? 무슨 일이 일어날 지?
답변:
작가가하는 일에 따라 다릅니다.
작성기가 기존 파일을 덮어 쓰면 작성기가 독자를 추월 할 때 새 내용을 보게됩니다. 작가와 독자가 가변 속도로 진행하는 경우 독자는 이전 내용과 새로운 내용을 볼 수 있습니다.
작성기가 파일을 쓰기 전에 파일을 자르면 해당 지점에서 파일 끝 부분에 대해 판독기가 실행됩니다.
기록기가 새 파일을 만든 다음 새 파일을 이전 이름으로 이동하면 판독기는 이전 파일을 계속 읽습니다. 열린 파일이 이동되거나 제거 된 경우 파일을 연 프로세스는 동일한 파일에서 계속 읽습니다. 파일이 제거되면 마지막 프로세스가 닫힐 때까지 실제로 디스크에 남아 있지만 다시 열 수는 없습니다.
유닉스 시스템은 필수 잠금 장치 가없는 경향이있다 . 응용 프로그램에서 작성기 구성 요소와 판독기 구성 요소가 서로 발가락을 밟지 않도록하려면 개발자는 적절한 잠금을 사용해야합니다. 커널에 의해 열린 파일이 루프 마운트 파일 시스템 이미지 또는 일부 유닉스 변형에서 실행되는 실행 파일 과 같은 사용자 응용 프로그램에 의한 쓰기로부터 보호되는 몇 가지 예외가 있습니다 .
ftp
/ sftp
시나리오 에도 적용 됩니까? 프로세스가 전송 된 ftp
파일을 읽기 시작 하고 새로운 파일 전송으로 인해 동일한 파일의 다른 버전이 파일을 덮어 쓰고 있다고 가정합니다.
고전적인 경쟁 조건이므로 정의에 의해 결과를 예측할 수 없습니다.
그 중에서도
fopen(3)
또는 open(2)
쓰기 모드파일을 다시 쓰는 동안 파일을 읽을 수 있어야하는 경우 작성기가 파일의 임시 사본을 작성하고 수정 한 다음 원래 파일로 다시 복사 할 수 있습니다. rsync
예를 들어 이런 식 으로이 작업을 수행합니다. 이를 구현하는 방법에는 여러 가지가 있지만 무료 점심 식사는 없습니다. 각 방법에는 고유 한 단점과 영향이 있습니다.