File Descriptor

Posted by Joonki Chung on Friday, February 24, 2017 Tags: linux   2 minute read

유닉스 시스템에서 모든 것은 파일이다. 일반적인 정규파일에서부터 디렉토리, 소켓, 파이프, 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때에 파일 디스크립터라는 개념을 이용한다.

파일 디스크립터는 Non-negative integer 값을 갖는다. 프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근 할 때, FD 값을 이용해 파일을 지칭 할 수 있다.

프로그램이 프로세스로 메모리에서 실행을 시작 할 때, 기본적으로 할당되는 파일 디스크립터들이 있다. 바로 표준 입력(Standard Input), 표준 출력(Standard Output), 표준 에러(Standard Error)이다. 이 들에게 각각 0, 1, 2 라는 정수가 할당되며, POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO로 참조된다.

리다이렉션(redirection, 재지향)은 열려있는 파일의 입출력을 다른 파일로 변환할 때 사용된다. 리다이렉터는 >로 나타내며, 쉽게, “모든 출력은 꺽쇠의 방향으로!” 라고 이해하면 된다.

리다이렉션은 파일 디스크립터와 함께 사용될 수 있으며, 몇 가지 예를 들면 아래와 같다.

  • > file : 표준 출력을 파일로 보낸다.
  • 1> file : 위와 동일하다. > 앞의 1은 표준 출력에 대한 파일 디스크립터를 나타낸다.
  • 2> file : 에러 출력을 file 로 보낸다.
  • < file : file로부터 표준 입력을 받는다.
  • 0< file : 위와 동일하다. < 앞의 0은 표준 입력 파일 디스크립터를 나타낸다.
  • i>&j : i번 파일 디스크립터를 j번 파일 디스크립터로 리다이렉트한다. 즉, i가 가리키는 파일의 모든 출력은 j가 가리키는 파일로 보낸다.

따라서, 위 문제점에서의 구문은 아래와 같은 형태로 정리될 수 있다. $cat notexist > /dev/null 2>&1

  • cat notexist : notexist 파일의 내용을 조회해서,
  • > : (표준 출력으로) 나오는 결과를 다음 파일로 보낸다.
  • /dev/null : 유닉스의 블랙홀과 같은 파일이다. 이 파일을 모든 출력을 흡수한다. (보이지 않는다.)
  • 2> : 에러 메세지가 발생할 경우에는, 즉 에러 출력을,
  • &1 : 1번 표준 출력 파일 디스크립터가 참조하고 있는 곳으로 보낸다.

즉, 조회한 내용과 발생한 에러 모두 표시하지 않겠다는 뜻이었다.

References

http://dev-ahn.tistory.com/m/96 http://ohgyun.com/328