파일을 덮어 쓰면서 파일을 읽으면 어떻게됩니까? 쓰는 동안 파일을 읽은다고

다른 프로세스가 내용을 다시 쓰는 동안 파일을 읽은다고 가정합니다. 출력을 예측할 수 있습니까? 무슨 일이 일어날 지?



답변

작가가하는 일에 따라 다릅니다.

작성기가 기존 파일을 덮어 쓰면 작성기가 독자를 추월 할 때 새 내용을 보게됩니다. 작가와 독자가 가변 속도로 진행하는 경우 독자는 이전 내용과 새로운 내용을 볼 수 있습니다.

작성기가 파일을 쓰기 전에 파일을 자르면 해당 지점에서 파일 끝 부분에 대해 판독기가 실행됩니다.

기록기가 새 파일을 만든 다음 새 파일을 이전 이름으로 이동하면 판독기는 이전 파일을 계속 읽습니다. 열린 파일이 이동되거나 제거 된 경우 파일을 연 프로세스는 동일한 파일에서 계속 읽습니다. 파일이 제거되면 마지막 프로세스가 닫힐 때까지 실제로 디스크에 남아 있지만 다시 열 수는 없습니다.

유닉스 시스템은 필수 잠금 장치 가없는 경향이있다 . 응용 프로그램에서 작성기 구성 요소와 판독기 구성 요소가 서로 발가락을 밟지 않도록하려면 개발자는 적절한 잠금을 사용해야합니다. 커널에 의해 열린 파일이 루프 마운트 파일 시스템 이미지 또는 일부 유닉스 변형에서 실행되는 실행 파일 과 같은 사용자 응용 프로그램에 의한 쓰기로부터 보호되는 몇 가지 예외가 있습니다 .


답변

고전적인 경쟁 조건이므로 정의에 의해 결과를 예측할 수 없습니다.

그 중에서도

  • fopen(3)또는 open(2)쓰기 모드
  • 작성기가 출력을 버퍼링하는 방법 /
  • 독자가 파일을 읽는 방법
  • 독자와 작가의 속도 차이
  • 읽기와 쓰기 시작의 시간 차이
  • 물론 현대식 멀티 코어 머신에서는 다른 요인들 (예 : 프로세스 스케줄링)에 의해 상황이 더욱 복잡해집니다.

파일을 다시 쓰는 동안 파일을 읽을 수 있어야하는 경우 작성기가 파일의 임시 사본을 작성하고 수정 한 다음 원래 파일로 다시 복사 할 수 있습니다. rsync예를 들어 이런 식 으로이 작업을 수행합니다. 이를 구현하는 방법에는 여러 가지가 있지만 무료 점심 식사는 없습니다. 각 방법에는 고유 한 단점과 영향이 있습니다.


답변

이전 응답자들은 이것보다 더 포괄적 인 설명을 가지고 있지만, 여기에 그가 원하는 것을 거의 정확하게 수행하는 트릭이 있습니다.

$ tail -f <filename>

파일이 작성되는 동안 파일의 끝을 보여줍니다. 예를 들어 STDERR을 파일로 파이프하지만 다른 터미널 창에서 여전히 보려면 ​​핸디합니다.