파일 설명자와 파일 이름의 차이점과 관계가 무엇인지 알고 싶습니다. 모두 파일에 액세스하는 데 사용됩니까? 그렇다면 같은 방법인가요?
예를 들어, /dev/fd/0
, /dev/stdin
및 /proc/self/fd/0
는 모두 에 대한 링크입니다 /dev/pts/2
. 이 네 개의 파일 설명자 또는 파일 이름은 무엇입니까?
답변1
/dev/fd/0
, /dev/stdin
, /proc/self/fd/0
4개 모두 /dev/pts/2
파일 이름입니다. /////dev/../dev/fd//0
, , 등도 마찬가지입니다 /bin/sh
. 마지막 예를 제외한 모든 것은 컴퓨터에 있는 기존 파일의 이름일 수 있습니다. 파일 이름은 Linux에서 파일 시스템의 파일을 지정하는 문자열입니다. 널 바이트를 포함하지 않고 길이가 최대 4096바이트인 문자열은 유효한 파일 이름입니다. 이러한 이름 중 대부분은 , ( 기존 디렉터리를 가정) 등과 동일 합니다. 지금까지 제시한 모든 예는 절대 파일 이름입니다. a로 시작하지 않고 의미가 현재 디렉터리에 따라 달라지는 상대 파일 이름도 있습니다 ./etc/fstab
/fioejfoeijf
/bin/sh
///bin/sh
/bin/../bin/sh
/bin
/
파일 이름과 관련된 용어는 보편적이지 않습니다. "파일 이름"은 파일의 전체 경로를 의미할 때도 있고 디렉터리 항목의 이름을 의미할 때도 있습니다. POSIX 용어는 "파일 이름" 또는"경로 이름 구성요소"를 디렉토리 항목의 이름으로, "경로명” 전체 경로를 얻으려면.
파일 설명자는 다음을 지정합니다.열려 있는특정 프로세스의 파일. 커널은 각 프로세스에 대한 파일 설명자 테이블을 유지 관리합니다. 파일 설명자 테이블의 각 항목은 프로세스가 파일 설명자에 대한 읽기, 쓰기 및 기타 작업을 요청하는 경우 수행할 작업을 나타냅니다.
파일 설명자는 파일에 해당하고 연관된 이름을 가질 수 있지만 모든 파일 설명자가 그런 것은 아닙니다. 그렇게 하는 경우 파일은 일반 파일, 디렉터리, 장치 파일 또는명명된 파이프(FIFO라고도 함)(만들어진 종류mkfifo
) 일부 시스템에는 Unix 소켓과 같은 더 많은 가능성이 있습니다.문. 연관된 명명된 파일이 없는 파일 설명자의 예는 다음과 같습니다.관로(이런 종류의pipe
시스템 호출) 및 네트워크소켓.
/dev/fd/0
, /dev/stdin
그리고 /proc/self/fd/0
특별한 의미를 지닌 파일 이름입니다(모두 동등함): 모두 파일 설명자 0을 통해 현재 액세스되는 파일을 지정합니다. 프로세스가 이러한 파일을 열면 커널은 파일 설명자 테이블의 인덱스 0에 있는 항목을 새 설명자에 복사합니다. 이러한 파일을 여는 것은 다음을 호출하는 것과 같습니다.dup(0)
. 명명된 파일은 새 파일을 여는 대신 이미 열려 있는 파일을 사용하도록 프로세스에 지시하는 간접적인 방법입니다. 이는 열려는 파일 이름이 필요한 프로그램의 명령줄을 전달하는 데 가장 유용합니다.
답변2
파일 이름은 파일 시스템에 있는 파일의 이름일 뿐이며 그 이상은 아닙니다. 단지 문자열일 뿐입니다.
파일 설명자는 읽거나 쓸 수 있는 일종의 객체입니다. 열려 있고 준비된 파일입니다. 파일 설명자만 있는 것이 아닙니다. stdin, stdout 및 stderr도 설명자이며 파일과 정확히 동일한 기능을 사용하여 파일 설명자에 쓰고 읽을 수 있습니다(탐색을 수행할 수 없다는 점만 제외). 파일이 아닌 설명자의 다른 예로는 명명된 파이프와 네트워크 소켓이 있습니다.
코드에서 파일 설명자는 파일 객체를 나타내는 커널의 무언가에 대한 포인터인 변수입니다.
예를 들어, /dev/fd/0, /dev/stdin, /proc/self/fd/0은 모두 /dev/pts/2에 대한 링크입니다. 이 네 개의 파일 설명자 또는 파일 이름은 무엇입니까?
이는 특정 스크립트나 프로그램에 유용한 의사 파일입니다. 파일을 열 수 있으며 open()은 파일 설명자를 반환합니다.