파일 설명자 란 무엇입니까?

파일 설명 자는 컴퓨터의 운영 체제에서 열려있는 파일을 고유하게 식별하는 번호입니다. 데이터 자원과 해당 자원에 액세스하는 방법에 대해 설명합니다.

프로그램이 파일 또는 네트워크 소켓과 같은 다른 데이터 자원을 열 것을 요청하면 운영 체제의 커널이 액세스 권한을 부여하고 전역 파일 테이블에 항목을 만들고 소프트웨어에 해당 항목의 위치를 ​​제공합니다.

설명자는 0, 12 또는 567 과 같은 고유 한 음수가 아닌 정수로 식별됩니다. 시스템에있는 모든 열린 파일에 대해 하나 이상의 파일 설명자가 존재합니다.

파일 디스크립터는 Unix에서 처음 사용되었으며 Linux, macOS X 및 BSD와 같은 최신 운영 체제에서 사용되었습니다. Microsoft Windows에서 파일 설명자는 파일 핸들이라고합니다.

  • 개요
  • Stdin, stdout 및 stderr
  • 파일 설명자를 리디렉션

프로세스가 파일 열기를 성공적으로 요청하면 커널은 커널의 전역 파일 테이블 에있는 항목을 가리키는 파일 설명자를 반환 합니다 . 파일 테이블 항목에는 파일의 inode, 바이트 오프셋, 해당 데이터 스트림에 대한 액세스 제한 (읽기 전용, 쓰기 전용 등)과 같은 정보가 들어 있습니다.

Stdin, stdout 및 stderr

유닉스 계열 운영체제에서 처음 세 개의 파일 디스크립터는 기본적으로 STDIN (표준 입력), STDOUT (표준 출력) 및 STDERR (표준 오류)입니다.

이름파일 설명자기술약어
표준 입력0명령 파이프 라인과 같이 입력을위한 기본 데이터 스트림입니다. 터미널에서이 기본값은 사용자의 키보드 입력입니다.표준
표준 출력1출력용 기본 데이터 스트림 (예 : 명령이 텍스트를 인쇄하는 경우). 터미널에서이 기본값은 사용자의 화면입니다.표준 출력
표준 에러2발생하는 오류와 관련된 출력의 기본 데이터 스트림입니다. 터미널에서이 기본값은 사용자의 화면입니다.표준어

파일 설명자를 리디렉션

파일 디스크립터는 bash, Linux의 기본 쉘, macOS X 및 Linux 용 Windows 서브 시스템을 사용하여 직접 액세스 할 수 있습니다.

예를 들어 find 명령을 사용하면 정상 출력은 stdout (파일 설명자 1 )으로 이동하고 오류 메시지는 stderr (파일 설명자 2 )로 이동합니다. 두 스트림 모두 터미널 출력으로 표시됩니다.

 / - 이름 '* 뭔가 *'찾기 
 `/ run / udisks2 ': 허가가 거부되었습니다 :`/ run / wpa_supplicant': 허가가 거부되었습니다 / usr / share / something / usr / usr / share / doc / something / usr / share / doc / something / examples / / 게임 / 무언가 

find 는 우리가 읽을 수있는 권한이없는 몇 개의 시스템 디렉토리를 검색하려고하기 때문에 에러가 발생합니다. "Permission denied"라는 말은 stderr 에 쓰여지고 다른 줄은 stdout 에 쓰여졌습니다.

파일 설명자 2를 / dev / null 로 리디렉션하여 stderr 를 숨길 수 있습니다. Linux에서는 "아무데도 가지 않습니다"라는 특수 장치입니다.

 / * 이름 찾기 * something * '2> / dev / null 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / 무언가 

오류는 / dev / null 로 보내졌으며 표시되지 않습니다.

stdoutstderr 의 차이점을 이해하는 것은 프로그램의 출력 작업을 할 때 중요합니다. 예를 들어 find 명령의 출력을 grep 하려고하면 표준 출력 만 grep에 파이프되기 때문에 오류 메시지가 필터링되지 않습니다.

 / 이름 찾기 '* something *'| grep 'something' 
 `/ run / udisks2 ': 허가가 거부되었습니다 :`/ run / wpa_supplicant': 허가가 거부되었습니다 / usr / share / something / usr / usr / share / doc / something / usr / share / doc / something / examples / / 게임 / 무언가 

그러나 표준 오류를 표준 출력으로 리디렉션 할 수 있으며 grep 은 두 텍스트를 모두 처리합니다.

 / * 이름을 찾으시오 * '* something *'2> & 1 | grep 'something' 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / 무언가 

위의 명령에서 대상 파일 설명자 ( 1 )의 접두사는 앰퍼샌드 ( " & ")입니다. 데이터 스트림 재 지정에 대한 자세한 정보는 bash 쉘의 파이프 라인을 참조하십시오.

bash에서 파일 디스크립터를 생성하고 사용하는 예제는 exec 내장 명령 예제를 참조하십시오.

파일 핸들, 운영 체제 용어