파일 디스크립터 대 파일 이름


12

파일 설명자와 파일 이름의 차이점과 관계가 무엇인지 궁금합니다. 그들은 모두 파일에 액세스하는 데 사용됩니까? 그렇다면 같은 방법으로?

예를 들어, /dev/fd/0, /dev/stdin,과 /proc/self/fd/0에 대한 모든 링크가 있습니다 /dev/pts/2. 이 네 가지 파일 설명자입니까, 아니면 파일 이름입니까?


답변:


12

모든 사 /dev/fd/0, /dev/stdin, /proc/self/fd/0/dev/pts/2파일 이름입니다, 등이다 /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, 등 모든하지만 마지막 예 가능성이 컴퓨터에있는 기존 파일의 이름이 될 수 있습니다. 파일 이름은 파일 시스템에서 파일을 지정할 수있는 문자열입니다. Linux에서 널 바이트를 포함하지 않고 최대 길이가 4096 바이트 인 문자열은 유효한 파일 이름입니다. 이 이름의 대부분은 예를 들면, 동일 /bin/sh에 해당됩니다 ///bin/sh, /bin/../bin/sh(가정 /bin기존 디렉토리입니다) 등 내가 준 모든 예제는 지금까지 절대 파일 이름입니다; 상대 파일 이름도 있습니다.이 이름은 a로 시작하지 않으며 /그 의미는 현재 디렉토리에 따라 다릅니다.

파일 이름을 둘러싼 용어는 보편적이지 않습니다. 때때로“파일 이름”은 파일의 전체 경로를 의미하며 때로는 디렉토리 항목의 이름을 의미합니다. POSIX 용어는 디렉토리 항목의 이름 은 " filename "또는 " pathname component " , 전체 경로는 " pathname "입니다.

파일 디스크립터 는 특정 프로세스에서 열린 파일을 지정합니다 . 커널은 각 프로세스에 대한 파일 디스크립터 테이블을 유지 관리합니다. 파일 디스크립터 테이블의 각 항목은 프로세스가 파일 디스크립터에 대한 읽기, 쓰기 및 기타 조작을 요청하는 경우 수행 할 작업을 나타냅니다.

파일 디스크립터는 파일에 해당 할 수 있으며 이름이 연관되어 있지만 모두는 아닙니다. 그렇게하는 파일은 파일이 일반 파일, 디렉토리, 장치 파일 또는 명명 된 파이프 (FIFO라고도 함) (에 의해 생성 된 종류 mkfifo) 일 수 있습니다. 일부 시스템에는 유닉스 소켓 및 도어와 같은 추가 가능성이 있습니다. 관련된 명명 된 파일이없는 파일 디스크립터의 예에는 파이프 (가 만든 종류 pipe) 및 네트워킹 소켓이 포함 됩니다.

/dev/fd/0, /dev/stdin그리고 /proc/self/fd/0고유 한 의미의 파일 이름 (모두 동일) : 모두 파일 디스크립터 0을 통해 현재 액세스 된 파일을 지정합니다. 프로세스가 파일 디스크립터를 열면 커널은 파일 디스크립터 디스크립터 테이블에서 색인 0이있는 항목을 새 파일로 복사합니다. 기술자. 이 파일 중 하나를 여는 것은 호출하는 것과 같습니다 dup(0). 명명 된 파일은 프로세스가 새 파일을 여는 대신 이미 열려있는 파일 중 하나를 사용하도록 간접적으로 얻는 방법입니다. 프로그램의 파일 이름을 열 것으로 예상되는 프로그램의 명령 행을 전달하는 데 주로 유용합니다.


@Giles 당신은 "파일 디스크립터 테이블의 각 항목 은 프로세스가 파일 디스크립터에 대한 읽기, 쓰기 및 기타 작업을 요청 하는 경우 수행 할 작업을 나타냅니다 ."( 강조 광산). 내가 이해하는 한 stdin, stdout 및 stderr에 대한 표준 0,1,2 등과 같은 정수 일뿐입니다. 일반 파일의 경우 더 높은 값이됩니다. 내가 당신의 의견에서 얻지 못한 것은이 숫자가 "프로세스가 파일 설명자에 대한 읽기, 쓰기 및 기타 작업을 요청하는 경우 수행 할 작업"을 나타내는 방법입니다. . 좀 더 확장 해 주시겠습니까?
Geek

@Geek 파일 설명자 테이블의 항목이 숫자가 아닙니다. 숫자는 해당 테이블의 인덱스입니다.
Gilles 'SO- 악한 중지'

@Giles 내 오해를 명확히 해 주셔서 감사합니다. 나는 지금 그것을 더 잘 이해합니다. 답에 "무엇을해야하는지"에 대한 예를들 수 있습니다. 파일 디스크립터 테이블의 각 항목에 파일 오프셋, 파일 상태 등과 같은 정보가 포함 된 파일 테이블에 대한 포인터가 다시 있음을 알았습니다. 그러나 여전히 답에 "수행 할 작업"부분이 명확하지 않습니다.
Geek

2

파일 이름은 파일 시스템의 파일 이름 일 뿐이며 문자열 일뿐입니다.

파일 디스크립터는 읽고 쓸 수있는 일종의 객체입니다. 파일이 열리고 준비된 파일입니다. stdin, stdout 및 stderr도 디스크립터이므로 파일과 동일한 기능을 사용하여 파일 디스크립터를 읽고 읽을 수 있습니다 (예를 들어, 검색 할 수없는 경우는 제외). 파일이 아닌 디스크립터의 다른 예는 다음과 같습니다. 명명 된 파이프 및 네트워크 소켓.

코드에서 파일 디스크립터는 파일 객체를 나타내는 커널의 무언가를 가리키는 변수입니다.

예를 들어, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0은 모두 / dev / pts / 2에 대한 링크입니다. 이 네 가지 파일 설명자입니까, 아니면 파일 이름입니까?

이것은 모두 의사 파일이며 일부 스크립트 또는 프로그램에 유용 할 수 있습니다. 그것들을 열 수 있고 open ()은 파일 설명자를 반환합니다.

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