2011-09-22 3 views
6

모든 프로세스에는 파일 설명자 테이블 (FDT)이 있으며 각 파일에는 파일 설명자가 있습니다. stdin, stdout 및 stderr에 대한 파일 설명자는 0, 1 및 2입니다.이 값은 모든 프로세스에서 동일합니다. 내가 믿는 FDT는 해당 파일의 INODE 항목에 대한 참조를 포함합니다. 파일 기술자는 프로세스간에 재사용됩니다. 즉, 전역 적으로 고유하지 않습니다. 각 프로세스의 FDT가 참조하는 커널에 의해 유지 관리되는 전역 FDT가 있습니까? stdin, stdout 및 stderr에 대한 FDT는 무엇에 해당합니까? 이 특별한 파일들은 키보드, 디스플레이 등과 연결되어 있습니다. 기사, 서적 등에 대한 링크를 제공하십시오.유닉스의 파일 기술자에 대한 도움말

답변

7

좋은 출발점은 2001 년부터 "A small trail through the Linux kernel"이라는 기사입니다. 구현은 계속되었지만 a more recent kernel에서 가장 잘 공부합니다.

커널 내에서 열려있는 파일 설명 자 각각은 열린 파일 또는 장치에 대한 모든 정보가 들어있는 에 해당합니다. 파일 설명자는 실제로 프로세스의 FDT에 대한 인덱스 이상입니다. 리눅스 커널에서 struct filefd_install() 함수에 의해 FDT에 연결됩니다. struct filedup2 system call으로 다른 파일 설명자에 재 할당 할 수 있습니다.

프로세스가 CLONE_FILES 플래그를 사용하여 clone 시스템 호출에 의해 생성되었지만 전역 FDT가없는 경우 프로세스는 동일한 FDT를 공유 할 수 있습니다. 정상적인 fork 작업은 상위 FDT의 복사본 인 새 FDT를 만듭니다. 이를 실제로 사용하려면 멀티 스레드 응용 프로그램의 각 스레드가 공통 FDT를 공유하는 복제 된 프로세스가되어야하며 모든 스레드가 동일한 정수 파일 설명자를 사용할 수 있어야합니다. fork/exec을 사용하여 새 프로세스를 만들면 새 프로세스가 동일한 파일 설명자로 시작되지만 부모 프로세스에 영향을주지 않고 파일을 열고 닫을 수 있습니다.

stdin, stdout, stderr에 대한 FDT 항목은 상위 항목으로부터 상속됩니다. 이 세 가지 FDT 항목에 대한 커널 구현에는 특별한 것이 없습니다. 그 의미는 C 라이브러리의 일반적인 사용에 기인합니다. 상위 프로세스 만이 연결 대상을 결정합니다. 캐릭터 장치에 연결하거나 파일이나 파이프에 연결되었을 수 있습니다. 캐릭터 디바이스의 경우 가장 일반적인 것은 tty 또는 pty 디바이스입니다. 무료 도서 Linux Device Driversa good overview입니다.

+1

3 단락의 끝에서, 하위 프로세스가 부모에게 영향을 미치지 않고 파일을 열고 닫을 수 있다는 것을 의미한다고 생각합니다. –