파일을 덮어 쓰면서 파일을 읽으면 어떻게됩니까?


26

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


3
동작은 정의되어 있지 않으므로 절대이 작업을 수행해서는 안됩니다.
데이지

답변:


19

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

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

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

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

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


질, 당신의 설명은 ftp/ sftp시나리오 에도 적용 됩니까? 프로세스가 전송 된 ftp파일을 읽기 시작 하고 새로운 파일 전송으로 인해 동일한 파일의 다른 버전이 파일을 덮어 쓰고 있다고 가정합니다.
iruvar

@ 1_CR 예. 이 경우 기록기와 판독기는 ftpd 프로세스입니다.
Gilles 'SO- 악마 그만

여기에서 추월의 의미는 무엇입니까?
Victor Choy

@VictorChoy 표준 의미 : 다른 사람의 뒤 / 뒤에서 시작하여 어느 시점에서 그들보다 앞서 나가는 것.
Gilles 'SO- 악의를 멈춰라

18

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

그 중에서도

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

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


1
이 답변은 내 것보다 훨씬 포괄적입니다. 내 답변을 삭제합니다.
킬러 미스트

0

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

$ tail -f <filename>

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.