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 관리의 핵심: 모든 입출력 작업은 궁극적으로 파일 디스크립터를 통해 이뤄짐
특징
- 파일 디스크립터 제한
- 각 프로세스는 제한된 수의 파일 디스크립터를 가짐
- 고부하 어플리케이션에서는 해당 제한을 늘린다.
- ulimit -n 명령 프로세의 파일디스크립터 제한 확인
- 파일 디스크립터 작업을 위한 System Call
- open(): 새 파일 디스크립터 생성
- read(), write(): 파일 디스크립터를 통한 읽기/쓰기
- close(): 파일 디스크립터 닫기
- dup(), dup2(): 파일 디스크립터 복제
- fcntl(): 파일 디스크립터 속성 제어
- select(), poll(), epoll(): 여러 파일 디스크립터의 I/O 이벤트 모니터링
- 파일 디스크립터 상속
- 자식 프로세스는 fork() 호출 시 부모의 파일 디스크립터 테이블을 상속받음
- exec() 호출 시 파일 디스크립터는 기본적으로 유지되며 이는 파이프를 통한 프로세스 간 통신의 기반이 eh
- 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/