파일 설명자와 파일 이름의 차이점과 관계가 무엇인지 궁금합니다. 그들은 모두 파일에 액세스하는 데 사용됩니까? 그렇다면 같은 방법으로?
예를 들어, /dev/fd/0
, /dev/stdin
,과 /proc/self/fd/0
에 대한 모든 링크가 있습니다 /dev/pts/2
. 이 네 가지 파일 설명자입니까, 아니면 파일 이름입니까?
답변
모든 사 /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)
. 명명 된 파일은 프로세스가 새 파일을 여는 대신 이미 열려있는 파일 중 하나를 사용하도록 간접적으로 얻는 방법입니다. 프로그램의 파일 이름을 열 것으로 예상되는 프로그램의 명령 행을 전달하는 데 주로 유용합니다.
답변
파일 이름은 파일 시스템의 파일 이름 일 뿐이며 문자열 일뿐입니다.
파일 디스크립터는 읽고 쓸 수있는 일종의 객체입니다. 파일이 열리고 준비된 파일입니다. stdin, stdout 및 stderr도 디스크립터이므로 파일과 동일한 기능을 사용하여 파일 디스크립터를 읽고 읽을 수 있습니다 (예를 들어, 검색 할 수없는 경우는 제외). 파일이 아닌 디스크립터의 다른 예는 다음과 같습니다. 명명 된 파이프 및 네트워크 소켓.
코드에서 파일 디스크립터는 파일 객체를 나타내는 커널의 무언가를 가리키는 변수입니다.
예를 들어, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0은 모두 / dev / pts / 2에 대한 링크입니다. 이 네 가지 파일 설명자입니까, 아니면 파일 이름입니까?
이것은 모두 의사 파일이며 일부 스크립트 또는 프로그램에 유용 할 수 있습니다. 그것들을 열 수 있고 open ()은 파일 설명자를 반환합니다.