내가 가지고 있다고 말해공정 1그리고공정 2. 둘 다 정수 4에 해당하는 파일 설명자를 갖습니다.
그러나 각 프로세스에서 파일 설명자 4는 커널의 열린 파일 테이블에 있는 완전히 다른 파일을 가리킵니다.
어떻게 이럴 수있어? 파일 설명자는 열린 파일 테이블의 레코드에 대한 인덱스가 되어야 하지 않습니까?
답변1
파일 설명자(예: 4
예에서)는 프로세스별 인덱스입니다.파일 설명자 테이블,아니요열린 파일의 테이블입니다. 파일 설명자 항목 자체포함하다커널의 전역 열린 파일 테이블에 있는 항목의 인덱스와 파일 설명자 플래그입니다.
답변2
각 프로세스에는 자체 파일 설명자 테이블이 있습니다. 프로세스 1234의 파일 설명자 4는 프로세스 1234의 테이블 내부를 가리킵니다. 프로세스 5678의 파일 설명자 4는 프로세스 5678의 테이블 내부를 가리킵니다. 한 가지 꼭 알아야 할 점은 각 프로세스의 표준 입력, 표준 출력, 표준 오류인 파일 설명자 0, 1, 2가 리디렉션되는 위치를 가리킨다는 것입니다.
프로세스는 동일한 파일을 여러 번 열 수 있습니다. 예를 들어, 프로세스의 표준 출력과 표준 오류가 동일한 터미널이나 동일한 파일로 리디렉션되는 경우 이는 동시에 발생할 수 있습니다. 기본 파일 테이블 항목(예:리눅스struct file
)는 파일에 대한 정보 이상의 정보를 전달하며, 열기 모드(예: 읽기 또는 쓰기) 및 기타 상태(예: 실행 시 닫힘과 같은 플래그)도 포함합니다. 예를 들어, 프로세스는 파일 설명자 0에서만 읽기 위해 터미널을 열고 파일 설명자 2에서만 쓰기 위해 동일한 터미널을 열 수 있습니다. 파일 테이블 항목에는 파일에서의 프로세스 위치도 포함되어 있습니다. 프로세스는 lseek
동일한 파일의 서로 다른 두 위치에 액세스 하려고 할 수 있으므로 dup
파일에 대한 두 개의 핸들을 얻습니다.
답변3
각 프로세스에는 자체 파일 설명자 테이블이 있습니다. 그게 다야.
이것은 모두 잘 설명되어 있습니다.UNIX 네트워크 프로그래밍더 자세히 알고 싶다면 Richard Stevens의 작품을 읽어보세요.
답변4
각 파일 설명자가 로컬 파일 설명자 테이블에 인덱싱되어야 하는 이유를 시각화하려면 다음 상황을 살펴보세요.리디렉션유닉스 시스템에서. 프로세스가 표준 출력을 다른 파일로 리디렉션하여 "1"의 의미를 다른 프로세스로 변경하지 않고도 프로세스의 파일 설명자 "1"을 다시 로드할 수 있습니다. stdin과 stderr도 마찬가지입니다. 따라서 이 동작을 지원하려면 로컬 파일 설명자가 있어야 합니다.