771 words
4 minutes
[Linux]File Descriptor

Overview#

리눅스 파일 디스크립터 간단히 정리

1. File Descriptor#


Concept

  • File Descriptor : OS가 열린파일이나 IO 리소스를 식별하고 참조하기 위한 정수 기본적으로 unsigned int 값을 가짐. 파일접근에 대한 추상화 계층을 제공
  • stdin : File Descriptor 0, 표준입력, 보통 키보드 입력
  • stdout : File Descriptor 1, 표준출력, 보통 콘솔
  • stderr : File Descriptor 2, 표준에러, 보통 키보드 입력

  • 파일 디스크립터는 운영체제가 열린 파일을 참조하기 위해 사용하는 정수값
  • 프로세스가 파일을 열면 커널은 해당 파일에 대한 unsigned int를 할당 모든 프로세스는 자신만의 파일 디스크립터 테이블이 있음

표준 파일 디스크립터#

기본적으로 세 개의 표준 파일 디스크립터가 모든 프로세스에 자동으로 열림

0: 표준 입력(stdin) 1: 표준 출력(stdout) 2: 표준 에러(stderr)

핵심#

파일 디스크립터의 핵심은 모든것은 파일이라는 유닉스 철학에 기반한 파일접근에 대한 일관된 인터페이스 제공이다.

  • 프로세스 간 통신(IPC)의 기반: 파이프, 소켓 등의 IPC 메커니즘도 파일 디스크립터를 사용
  • I/O 관리의 핵심: 모든 입출력 작업은 궁극적으로 파일 디스크립터를 통해 이뤄짐

특징#

  1. 파일 디스크립터 제한
  • 각 프로세스는 제한된 수의 파일 디스크립터를 가짐
  • 고부하 어플리케이션에서는 해당 제한을 늘린다.
  • ulimit -n 명령 프로세의 파일디스크립터 제한 확인
  1. 파일 디스크립터 작업을 위한 System Call
  • open(): 새 파일 디스크립터 생성
  • read(), write(): 파일 디스크립터를 통한 읽기/쓰기
  • close(): 파일 디스크립터 닫기
  • dup(), dup2(): 파일 디스크립터 복제
  • fcntl(): 파일 디스크립터 속성 제어
  • select(), poll(), epoll(): 여러 파일 디스크립터의 I/O 이벤트 모니터링
  1. 파일 디스크립터 상속
  • 자식 프로세스는 fork() 호출 시 부모의 파일 디스크립터 테이블을 상속받음
  • exec() 호출 시 파일 디스크립터는 기본적으로 유지되며 이는 파이프를 통한 프로세스 간 통신의 기반이 eh
  1. Non-blocking I/O와 비동기 I/O
  • O_NONBLOCK 플래그를 사용하여 non-blocking 모드로 설정가능

2. File Descriptor Redirection#

파일디스크립터의 컨셉을 알고있으면 bash script에서 자주 쓰이는 패턴을 보다 쉽게 이해할수 있다.


Concept

  • 2>&1 : 스크립팅에서 표준 에러를 표준 출력으로 리다이렉트 할 때 사용. 에러와 출력 모두 같은 파일로 보내는 것
  • /dev/null : /dev/null은 기본적으로 데이터를 남기지 않고 없앤다는 의미. ./command > /dev/null 2>&1 은 표준 출력과 표준 에러를 모두 /dev/null로 보내는 것

Reference#

[Linux]File Descriptor
https://yjinheon.netlify.app/posts/05system/linux/de-linux-02-file_descriptor/
Author
Datamind
Published at
2023-10-20
License
CC BY-NC-SA 4.0