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