리눅스 시스템에서 열린 파일은 어떻게 동작합니까?


17

방금 로그 파일 이름을 "foo.log.old"로 바꾸고 응용 프로그램이 "foo.log"에서 새 로그 파일을 쓰기 시작한다고 가정했습니다. 로그 파일을 새로운 이름으로 추적하고 "foo.log.old"에 줄을 계속 추가한다는 사실에 놀랐습니다.

Windows에서는 이런 종류의 동작에 익숙하지 않습니다. 구현이 가능한지 모르겠습니다. 이 동작은 리눅스에서 정확히 어떻게 구현됩니까? 그것에 대해 더 배울 수있는 곳은 어디입니까?


나는 그것을 정말로 알지 못하기 때문에 이것을 대답으로하지는 않지만 파일을 이동할 때 변경되지 않는 inode와 관련이 있다고 생각합니다.
수학

답변:


20

프로그램은 파일 시스템에 의해 유지 관리되는 번호 (전통적인 유닉스 파일 시스템의 inode라고 함)를 통해 파일에 연결되며, 이름은 단지 참조 일 뿐이며 고유 한 참조는 아닙니다.

몇 가지 알아 두어야 할 사항 :

  1. 사용하여 파일을 이동 mv하면 (사용에 해당하는 파일 시스템을 통해 이동하지 않는 한 그 부하 번호를 변경하지 않는 cp한 후 rm원본에).
  2. 둘 이상의 이름이 단일 파일에 연결할 수 있으므로 (즉, 하드 링크가 있음) "삭제 된"파일의 데이터는 기본 파일에 대한 모든 참조가 사라질 때까지 사라지지 않습니다 .
  3. 아마도 가장 중요한 것은 프로그램 opensa 파일 일 때 파일이 연결된 파일 이름을 갖는 것과 같은 데이터를 참조하는 것입니다 (데이터가 삭제 될 때를 위해).

이것은 다음과 같은 몇 가지 행동을 야기합니다 :

  • 프로그램은 open파일을 읽을 수 는 있지만 사용자 rm가 명령 행에서 파일을 읽을 때까지 실제로 읽을 수는 없으며 프로그램은 여전히 ​​데이터에 액세스 할 수 있습니다 .
  • 당신이 만난 것 : mv파일을 가져도 파일과 파일이 열려있는 모든 프로그램 간의 관계를 끊지 않습니다 (파일 시스템 경계를 넘어 이동하지 않는 한 프로그램에는 여전히 원본 버전이 있습니다).
  • 프로그램이 open쓰기 위해 파일을 썼고 사용자 rm가 명령 행에서 마지막 파일 이름 인 경우, 프로그램은 파일에 파일을 넣는 즉시 계속할 수 있지만 닫는 즉시 해당 데이터에 대한 참조가 없습니다. 사라질 것입니다.
  • 하나 이상의 파일을 통해 통신하는 두 프로그램은 파일이 완료된 후 파일을 제거하여 원치 않는 부분 보안을 얻을 수 있습니다 open. (이것은 실제 보안이 아니라 단지 허점을 경쟁 조건으로 변형시킵니다.)

1
나는 @dmckee에 동의합니다. 프로그램은 open읽고 파일을 가질 수 있습니다 (문제의 로그 파일에서 발생한 것과 같이).
jsbillings

@jsbillings : 예, 그러나 위험이 있습니다. 모든 파일 시스템 이름이 사라지면 GB를 열린 파일에 기록하여 닫는 즉시 아침 이슬처럼 증발합니다.
dmckee

1
또한 inode는 커널에 복사되며 디스크 복사가 아니라 작동됩니다. 따라서 파일은 mv'd 또는 cp '일 수 있지만 열린 파일은 디스크 버전이 아닌 커널 데이터 구조에서 이미 작동하고 있습니다. 따라서 쓰기 위해 열려있는 파일에 다른 파일을 복사하는 경우 프로세스는 여전히 이전 파일과 동일한 상대 위치에 씁니다. 이것이 Apache httpd와 같은 프로그램에 로그 파일을 닫았다가 다시 여는 신호 핸들러가있는 이유입니다.
Arcege

0

이 동작이 어떻게 구현되는지 실제로 보려면 유닉스 프로그래밍 서적을 볼 수 있습니다. Mathepic은 inode와 관련이 있다는 점에서 옳습니다. 실제 경로 이름은 파일을 여는 데만 사용되며, 일단 완료되면 프로그램은 열린 파일 설명자가 파일을 참조합니다. 파일 디스크립터는 inode를 참조하며,이 경우 기본 파일 이름이 변경되었는지는 신경 쓰지 않습니다.

Windows에서 이것을 구현하는 한, 그것은 다른 사이트에 대한 질문입니다.

책을 쓰지 않고 이에 대해 더 읽으려면 리눅스 파일 시스템과 inode를 검색하십시오. 명확한 대답이 없을 수도 있지만 그 이유를 이해할 수 있습니다.


4
"주변에서 검색하십시오 – 좋은 답변을 찾지 못할 수도 있지만 이해할 것입니다"는 좋은 답변이 아닙니다.
mattdm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.