개발 일지/기타
파일 디스크립터란?
DDD Developer
2024. 9. 4. 12:29
728x90
반응형
파일 디스크립터 완벽 분석: 하나부터 열까지
1. 핵심 개념:
- 파일 접근을 위한 핸들: 파일 디스크립터(File Descriptor, 줄여서 fd)는 운영체제에서 프로세스가 파일에 접근하기 위해 사용하는 정수 값입니다. 파일을 열거나 생성할 때 운영체제는 해당 파일에 대한 정보를 관리하고, 프로세스에게 파일 디스크립터를 할당합니다. 이후 프로세스는 파일 디스크립터를 통해 파일 읽기, 쓰기, 닫기 등의 작업을 수행할 수 있습니다.
- 모든 것은 파일: 유닉스/리눅스 시스템에서는 모든 것을 파일로 취급합니다. 일반 파일, 디렉토리, 장치(키보드, 마우스, 모니터 등), 소켓, 파이프 등 모든 입출력 자원은 파일 디스크립터를 통해 관리됩니다.
2. 파일 디스크립터 테이블:
- 프로세스별 관리: 각 프로세스는 자신만의 파일 디스크립터 테이블을 가지고 있습니다. 이 테이블은 열려 있는 파일들에 대한 정보(파일 디스크립터, 파일 포인터, 접근 모드 등)를 저장합니다.
- 파일 디스크립터 범위: 일반적으로 파일 디스크립터는 0부터 시작하는 음수가 아닌 정수 값입니다. 0, 1, 2는 각각 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)에 미리 할당되어 있습니다.
3. 파일 디스크립터 관련 함수:
- open(): 파일을 열거나 생성하고, 파일 디스크립터를 반환합니다.
- read(): 파일 디스크립터를 통해 파일에서 데이터를 읽어옵니다.
- write(): 파일 디스크립터를 통해 파일에 데이터를 씁니다.
- close(): 파일 디스크립터를 닫고, 파일과의 연결을 해제합니다.
- dup(), dup2(): 파일 디스크립터를 복제합니다.
- fcntl(): 파일 디스크립터의 속성을 변경하거나 제어합니다.
- ioctl(): 장치 파일에 특정한 명령을 보냅니다.
4. 표준 입출력과 파일 디스크립터:
- 표준 파일 디스크립터:
- 0: 표준 입력(stdin), 일반적으로 키보드
- 1: 표준 출력(stdout), 일반적으로 모니터
- 2: 표준 에러(stderr), 일반적으로 모니터
5. 소켓 프로그래밍과 파일 디스크립터:
- 소켓도 파일: 네트워크 통신을 위한 소켓도 파일 디스크립터로 관리됩니다.
- 소켓 생성: socket() 함수를 통해 소켓을 생성하고, 파일 디스크립터를 얻습니다.
- 소켓 통신: read(), write() 함수를 사용하여 소켓을 통해 데이터를 주고받습니다.
6. 심화 주제:
- 파일 디스크립터와 파일 포인터: C 표준 라이브러리의 FILE 구조체는 파일 디스크립터를 포함하며, 파일 처리를 위한 추가적인 정보를 저장합니다.
- 파일 디스크립터 상속: 자식 프로세스는 부모 프로세스의 열려 있는 파일 디스크립터를 상속받을 수 있습니다.
- 파일 디스크립터 릭: 파일 디스크립터를 닫지 않고 프로그램이 종료되면 파일 디스크립터 릭이 발생하여 시스템 자원 낭비를 초래할 수 있습니다.
- 논 블로킹 I/O: fcntl() 함수를 사용하여 파일 디스크립터를 논 블로킹 모드로 설정하면, 입출력 작업이 완료될 때까지 기다리지 않고 즉시 제어를 반환합니다.
결론:
파일 디스크립터는 운영체제에서 파일 및 다양한 입출력 자원에 접근하기 위한 핵심 개념입니다. 파일 디스크립터를 이해하고 관련 함수들을 능숙하게 사용하면 파일 입출력, 네트워크 통신, 장치 제어 등 다양한 작업을 효율적으로 수행할 수 있습니다.
728x90
반응형