다른 프로세스에서 동일한 fd가 어떻게 같은 파일을 가리킬 수 있습니까?


25

프로세스 1프로세스 2 가 있다고 가정하십시오 . 둘 다 정수 4에 해당하는 파일 디스크립터를 가지고 있습니다.

그러나 각 프로세스에서 파일 디스크립터 4는 커널의 열린 파일 테이블에서 완전히 다른 파일을 가리 킵니다.

여기에 이미지 설명을 입력하십시오

어떻게 가능합니까? 파일 디스크립터가 Open File Table의 레코드에 대한 인덱스가 아니어야합니까?


1
좋은 질문! 내 생각에 파일 디스크립터가 변환 4되어 두 프로세스 의 fd 가 자신의 열린 fd 수와 관련이 있습니다. Fd 0-2(stdin, stdout, sdterr)는 항상 새 프로세스를 위해 열리고 숫자는 해당 프로세스에만 예약되어 있지 않습니다.


@ jw013 나는 이것이 친숙하다고 생각했다. \ @Pithikos 어떻게 중복되지 않습니까?
Michael Mrozek

1
이것은 좋지 않은 다이어그램입니다. 파일 설명자 4 는 "4"를 포함하는 항목이 아니라 왼쪽에있는 파일 설명자 테이블 의 네 번째 항목 (음, 다섯, 0부터 계산 됨)을 의미한다는 것을 보여 주어야합니다 . 실제 "4"는 숫자를 포함하는 사용자 공간 변수에 있습니다. 다른 질문의 다이어그램이 훨씬 좋습니다.
Random832

2
@ Random832 글쎄, 어떤 다이어그램이 올바른지 알았다면 아마도이 질문을 한 적이 없었을 것입니다.
Pithikos

답변:


35

파일 기술자는, 즉는 4귀하의 예제에서, 과정 별에 인덱스 파일 디스크립터 테이블 , 하지 오픈 파일 테이블. 파일 디스크립터 항목 자체 파일 디스크립터 플래그뿐만 아니라 커널의 전역 열린 파일 테이블의 항목에 대한 색인을 포함 합니다.


2
레코드의 경우, 대부분의 시스템에는 close-on-exec 플래그 인 "파일 설명자 플래그"가 하나만 있습니다. 다른 모든 "fd 당"상태 (오프셋 및 액세스 모드 포함)는 열린 파일 테이블 항목의 일부입니다.
Random832

24

각 프로세스에는 자체 파일 디스크립터 테이블이 있습니다. 프로세스 1234의 파일 디스크립터 4는 프로세스 1234의 테이블 내부를 가리 킵니다. 프로세스 5678의 파일 디스크립터 4는 프로세스 5678의 테이블 내부를 가리 킵니다. 익숙해야 할 경우 각 프로세스마다 표준 입력, 표준 출력 및 표준 오류 인 파일 설명자 0, 1 및 2가 있습니다.

프로세스는 동일한 파일을 두 번 이상 열 수 있습니다. 예를 들어 프로세스의 표준 출력 및 표준 오류가 동일한 터미널 또는 동일한 파일로 리디렉션 될 때 우연히 발생할 수 있습니다. 기본 파일 테이블 항목 (예 : Linux 'sstruct file )은 파일에 대한 정보 이상의 정보를 전달합니다. 또한 열기 모드 (예 : 읽기 또는 쓰기) 및 기타 상태 (예 : 플래그, 예를 들어 close-on-exec)가 포함됩니다. 예를 들어, 프로세스는 파일 디스크립터 0에서만 읽기 위해 열린 터미널과 파일 디스크립터 2에서만 쓰기 위해 열린 동일한 터미널을 가질 수 있습니다. 파일 테이블 항목에는 파일에서의 프로세스 위치도 포함됩니다. 프로세스 lseek는 동일한 파일에서 두 개의 다른 위치를 원할 수 있으므로 dup해당 파일에 대한 두 개의 핸들을 얻는 데 사용 됩니다.


2
이것은 완전히 정확하지 않습니다. man page / specs에 따르면 dup, 주석에서 정확히 말하는 것을 수행합니다. 결과 디스크립터 모두 동일한 파일 테이블 항목을 가리 키므로 동일한 오프셋을 공유합니다. 2 개의 다른 파일 테이블 항목을 얻으려면 open파일에 두 번 있어야한다고 확신합니다 .
jw013

@Gilles "프로세스 1234의 테이블 내의 프로세스 1234 포인트의 파일 디스크립터 4". 어떤 테이블을 의미합니까? 내가 아는 것에서 프로세스의 유일한 테이블은 각 레코드가 커널의 단일 Open File Table을 가리키는 File Descriptor Table 입니다.
Pithikos

보다 자세한 설명 은 unix.stackexchange.com/questions/195057/… 을 참조하십시오 .
Gilles 'SO- 악의를 멈춰라'


7

간접적 인 수준으로 문제가 해결되지 않습니까? ( "컴퓨터 프로그래밍의 모든 문제는 추가적인 수준의 간접적 인 방법으로 해결할 수 있습니다"-현명한 greybeard) 즉, 각 프로세스의 작은 정수는 "공개 파일 테이블"에 커널 공간 인덱스의 프로세스 별 배열에 대한 인덱스로 끝납니다.


2
소스 현명한 수염이 희끗 희끗는 가능성 데이비드 윌러입니다. 그는 또한 말했다 나타납니다 " 일반적으로 다른 문제를 만들 것이라고하지만. :)"
jw013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.