프로그램이 파일 또는 네트워크 소켓과 같은 다른 데이터 자원을 열 것을 요청하면 운영 체제의 커널이 액세스 권한을 부여하고 전역 파일 테이블에 항목을 만들고 소프트웨어에 해당 항목의 위치를 제공합니다.
설명자는 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 로 보내졌으며 표시되지 않습니다.
stdout 과 stderr 의 차이점을 이해하는 것은 프로그램의 출력 작업을 할 때 중요합니다. 예를 들어 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 내장 명령 예제를 참조하십시오.
파일 핸들, 운영 체제 용어