파일 디스크립터의 수명은 얼마입니까?


11

여기 에 설명 된 것처럼 리디렉션 open()은 파일에 쓰는 데 사용 됩니다. 셸에서 내부 (?) 파일 설명자가 만들어져 필요할 때 사용됩니다.

내부 디스크립터는 스크립트 전체 또는 쉘 수명 동안 작성됩니까? 시간이 지나고 여러 번의 작업 등으로 파괴 되었습니까?

특히 쉘 자체가 내장 작업을 위해 여는 파일의 파일 설명자를 의미합니다. 디스크립터가 작성되고 각 조작에 대해 파일이 열립니까? 그들은 얼마나 오래 유지됩니까? 예:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

첫 번째 디스크립터 인스턴스는 두 번째 작업까지 유지됩니까?

터미널에서 사용하는 쉘은 어떻습니까? 나는 때때로 며칠, 심지어 몇 주 동안 한 세션을 열어 둡니다. 쉘 내장으로 작동 한 모든 파일의 설명자를 계속 유지합니까?

답변:


4

간단히 말해서 : 쉘은 명령이 완료된 직후 리디렉션과 관련된 파일 디스크립터를 거의 확실하게 닫습니다.


세부 정보 : POSIX에서 리디렉션 을 통해 열린 파일을 닫는 것에 대한 언급은 없습니다 (내가 아는 한). 그러나 즉시 닫지 않으면 유용하지 않습니다.

모든 명령이 시작되는 환경에 대한 규칙은 별도의 파일 기술자를 전달하는 것을 허용하지 않습니다. 쉘은 필요없는 명령을 시작할 때 저장된 추가 fd를 닫을 때주의를 기울여야합니다.

일반적인 > filename출력 경로 재 지정의 경우 파일 디스크립터가 저장된 경우에도 각 명령을 시작할 때 파일이 잘 려야합니다. 그리고 모든 관련 파일 이름이 바뀌거나 한편에서 제거 된 경우 저장된 파일 기술자가 잘못된 파일을 가리 것이다.

예를 들어, 첫 번째 echo로 열린 fd가 열려 있고 두 번째 로 그대로 사용 되면 올바르게 작동하지 않습니다 .

echo foo >> x; mv x y; echo bar >> x

외부 프로그램을 시작하는 데 사용되는 일반적인 fork + exec 모델은 명령이 종료 될 때 파일을 자동으로 닫는 것을 매우 쉽게 만듭니다. 셸 은 자식을 실제 명령으로 바꾸기 위해 fork()호출 exec()하기 전에 자식 프로세스에서 필요한 파일 을 먼저 열어야합니다 . 하위 프로세스가 종료되면 해당 프로세스에서 연 파일이 자동으로 닫힙니다.


그러나awk 출력 리디렉션의 구문은 셸과 유사하지만 명시 적으로 닫히지 않는 한 스크립트가 종료 될 때까지 열린 파일이 열린 상태로 유지됩니다. 이것은 foo한 번만 열리 며 인쇄물 사이에서 잘리지 않습니다.

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

완료되면 닫힙니다. 셸은 실행되는 각 명령에 대해 3 개의 파일 설명자 0,1,2를 만듭니다. 이것들은 단지 숫자이며, 숫자는 재사용됩니다. 쉘은 디스크립터를 재사용하기 전에 파일을 닫습니다.

파일 디스크립터도 다른 프로세스로 전달됩니다. 그리고 백그라운드에서 프로세스가있는 경우 여전히 파일 설명자가 있습니다.

예제에서는를 사용 3>&1합니다. 즉, 파일 설명자 3이 설명자 1이 현재 참조하는 파일을 참조하게합니다.

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