다른 프로세스가 파일 내용을 다시 쓰는 동안 내가 파일을 읽었다고 가정해 보겠습니다. 출력이 예측 가능합니까? 무슨 일이 일어날 지?
답변1
그것은 작가가 무엇을 하느냐에 달려 있습니다.
작성자가 기존 파일을 덮어쓰는 경우 작성자가 독자를 따라잡으면 독자는 새 콘텐츠를 보게 됩니다. 작성자와 독자가 다양한 속도로 진행하면 독자는 이전 콘텐츠와 새 콘텐츠를 번갈아 볼 수 있습니다.
기록기가 쓰기를 시작하기 전에 파일을 자르면 판독기는 해당 지점에서 파일의 끝 부분에 대해 실행됩니다.
작성자가 새 파일을 만든 다음 새 파일을 이전 이름으로 이동하면 리더는 이전 파일에서 계속 읽습니다. 열린 파일이 이동되거나 제거되면 파일을 연 프로세스는 동일한 파일에서 계속 읽습니다. 파일이 제거되면 마지막 프로세스가 파일을 닫을 때까지 실제로 디스크에 남아 있습니다(그러나 다시 열 수는 없음).
유닉스 시스템은 필수 사항이 아닌 경향이 있습니다.자물쇠. 애플리케이션이 작성기 구성 요소와 판독기 구성 요소가 서로 밟지 않도록 하려는 경우 적절한 잠금을 사용하는 것은 개발자의 몫입니다. 커널에 의해 열린 파일이 사용자 애플리케이션에 의해 기록되지 않도록 보호될 수 있는 몇 가지 예외가 있습니다.고리-마운트된 파일 시스템 이미지 또는 일부 유닉스 변형에서 실행되는 실행 파일.
답변2
이는 전형적인 경쟁 조건이므로 정의상 결과를 예측할 수 없습니다.
그 중에서도 다음 사항에 따라 달라집니다.
fopen(3)
또는open(2)
쓰기 모드,- 작성자가 출력을 버퍼링하는 방법/경우
- 독자가 파일을 어떻게 읽는지,
- 독자와 작가의 속도 차이,
- 읽기와 쓰기 시작 사이의 시간 차이.
- 물론 최신 멀티 코어 시스템에서는 다른 요인(예: 프로세스 스케줄링)으로 인해 상황이 훨씬 더 복잡해집니다.
파일을 다시 쓰는 동안 파일을 읽을 수 있어야 하는 경우 작성자가 파일의 임시 복사본을 만들고 이를 수정한 다음 원본 파일에 다시 복사하도록 할 수 있습니다. 예를 들어 이런 식으로 rsync
수행됩니다. 이를 구현하는 방법에는 여러 가지가 있지만 공짜 점심은 없습니다. 각 방법에는 고유한 단점과 영향이 있습니다.
답변3
이전 응답자들은 이보다 더 포괄적인 설명을 가지고 있지만 여기에 그가 원하는 것을 거의 정확하게 수행하면서 확실히 작동하는 트릭이 있습니다.
$ tail -f <filename>
파일이 작성되는 동안 파일의 끝이 표시됩니다. 예를 들어, STDERR을 파일로 파이프하고 싶지만 여전히 다른 터미널 창에서 볼 수 있는 경우에 유용합니다.