프로세스 1 과 프로세스 2 가 있다고 가정하십시오 . 둘 다 정수 4에 해당하는 파일 디스크립터를 가지고 있습니다.
그러나 각 프로세스에서 파일 디스크립터 4는 커널의 열린 파일 테이블에서 완전히 다른 파일을 가리 킵니다.
어떻게 가능합니까? 파일 디스크립터가 Open File Table의 레코드에 대한 인덱스가 아니어야합니까?
프로세스 1 과 프로세스 2 가 있다고 가정하십시오 . 둘 다 정수 4에 해당하는 파일 디스크립터를 가지고 있습니다.
그러나 각 프로세스에서 파일 디스크립터 4는 커널의 열린 파일 테이블에서 완전히 다른 파일을 가리 킵니다.
어떻게 가능합니까? 파일 디스크립터가 Open File Table의 레코드에 대한 인덱스가 아니어야합니까?
답변:
각 프로세스에는 자체 파일 디스크립터 테이블이 있습니다. 프로세스 1234의 파일 디스크립터 4는 프로세스 1234의 테이블 내부를 가리 킵니다. 프로세스 5678의 파일 디스크립터 4는 프로세스 5678의 테이블 내부를 가리 킵니다. 익숙해야 할 경우 각 프로세스마다 표준 입력, 표준 출력 및 표준 오류 인 파일 설명자 0, 1 및 2가 있습니다.
프로세스는 동일한 파일을 두 번 이상 열 수 있습니다. 예를 들어 프로세스의 표준 출력 및 표준 오류가 동일한 터미널 또는 동일한 파일로 리디렉션 될 때 우연히 발생할 수 있습니다. 기본 파일 테이블 항목 (예 : Linux 'sstruct file
)은 파일에 대한 정보 이상의 정보를 전달합니다. 또한 열기 모드 (예 : 읽기 또는 쓰기) 및 기타 상태 (예 : 플래그, 예를 들어 close-on-exec)가 포함됩니다. 예를 들어, 프로세스는 파일 디스크립터 0에서만 읽기 위해 열린 터미널과 파일 디스크립터 2에서만 쓰기 위해 열린 동일한 터미널을 가질 수 있습니다. 파일 테이블 항목에는 파일에서의 프로세스 위치도 포함됩니다. 프로세스 lseek
는 동일한 파일에서 두 개의 다른 위치를 원할 수 있으므로 dup
해당 파일에 대한 두 개의 핸들을 얻는 데 사용 됩니다.
dup
, 주석에서 정확히 말하는 것을 수행합니다. 결과 디스크립터 모두 동일한 파일 테이블 항목을 가리 키므로 동일한 오프셋을 공유합니다. 2 개의 다른 파일 테이블 항목을 얻으려면 open
파일에 두 번 있어야한다고 확신합니다 .
각 프로세스에는 자체 파일 디스크립터 테이블이 있습니다. 그게 다야.
깊이있게 배우고 싶다면 Richard Stevens의 UNIX Network Programming 에 잘 설명되어 있습니다.
4
되어 두 프로세스 의 fd 가 자신의 열린 fd 수와 관련이 있습니다. Fd0-2
(stdin, stdout, sdterr)는 항상 새 프로세스를 위해 열리고 숫자는 해당 프로세스에만 예약되어 있지 않습니다.