파일 디스크립터란
파일 디스크립터는 리눅스, 유닉스 계열의 시스템에서 프로세스가 파일에 접근할 때 이용하는 개념입니다.
유닉스 시스템에서는 모든 것이 파일입니다. 우리가 아는 일반적인 파일부터 디렉토리, 소켓, 파이프 등 모든 객체가 파일로서 관리됩니다. 이 파일들에 접근할 때 파일 디스크립터를 이용합니다.
프로세스는 특정 파일에 접근할 때 커널로부터 사용할 정수값을 할당 받습니다.
정확히는 운영체제 커널이 프로세스에게 파일에 접근할 수 있는 인덱스를 할당해주는데 이 인덱스를 파일 디스크립터라고 하며, 파일 디스크립터 인덱스로 이루어진 테이블이 존재합니다.
프로세스가 파일을 열면 커널은 파일 디스크립터의 남아있는 숫자 중 가장 작은 값을 할당해줍니다. 이 후부터는 프로세스가 파일에 접근할 때, FD 값을 이용해 파일을 지칭할 수 있습니다.
파일 디스크립터는 0이 아닌 양의 정수값으로 이루어져 0 ~ OPEN_MAX 값을 가질 수 있으며, OPEN_MAX값은 플랫폼마다 다릅니다.
프로그램이 프로세스로 실행될 때, 기본적으로 할당되는 파일 디스크립터가 있습니다.
- 표준 입력 (Standard Input) : 0 | STDIN_FILENO
- 표준 출력 (Standard Output) : 1 | STDOUT_FILENO
- 표준 에러 (Standard Error) : 2 | STDERR_FILENO
각각 앞의 정수값이 할당되며 뒤의 매크로로 참조할 수 있습니다.
위 그림을 보면 FD가 단순 인덱스임을 확인할 수 있습니다. 각 프로세스는 맨 왼쪽의 FD 테이블을 갖고 있고, FD 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 갖고 있습니다. 이 포인터를 이용해 시스템의 파일을 참조할 수 있습니다. 프로세스는 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없고, 반드시 커널을 통해서 수정해야 합니다.
파일 디스크립터 할당 받기
사용자 지정 파일을 읽거나 쓰는 경우 open() 함수를 사용해 할당 받을 수 있습니다.
파일명과 사용할 옵션을 매개변수로 지정해 호출하면 해당 파일의 FD값이 반환값으로 주어집니다. 해당 반환값으로 파일에 접근이 가능합니다.
옵션은 O_RDONLY | O_WRONLY | O_RDWR , 각각 읽기 전용, 쓰기 전용, 읽기쓰기 옵션입니다.
터미널에서 프로세스에서 사용중인 FD 목록을 확인할 수 있습니다.
일반 파일과 같이 소켓 네트워크 통신을 하는 경우에도 파일 디스크립터를 이용합니다. 소켓 프로그래밍에서는 socket(), accept() 함수를 통해 소켓의 FD를 할당받을 수 있습니다.
socket(프로토콜 체계, 데이터 전송 방식, 프로토콜 정보) 와 같이 함수를 쓸 수 있고, 반환값으로 FD값을 받을 수 있습니다.
프로토콜 체계
- AF_INET : IPv4
- AF_INET6 : IPv6
데이터 전송 방식
- SOCK_STREAM : TCP 소켓
- SOCK_DGRAM : UDP 소켓
프로토콜 정보
- 앞선 인자만으로 프로토콜을 정확히 특정할 수 없는 경우에만 명시해주면 됩니다. 특정 가능한 경우 위의 예시처럼 0으로 작성해도 무관합니다.
출처
리눅스 - 파일 디스크립터
File Descriptor (파일 디스크립터) [출처: http://dev.plusblog.co.kr/22] 1. 파일 디스크립터 - 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값- 프로세스에서 열린 파일의 목록을 관리하는 테이
dev-ahn.tistory.com
[소켓 프로그래밍] 파일 디스크립터
파일 디스크립터란 시스템(운영체제)가 파일에 할당해준 정수값을 의미한다. 이는 꼭 파일만이 아니라 소켓에도 해당하는데, 예를 들어 소켓을 생성하는 socket 함수 또는 연결을 수락하는 accept
velog.io
[네트워크] 소켓의 생성과 주소할당
서버와 클라이언트가 통신하는데에 필요한 정보는 IP 주소와 port번호이다. 즉, 소켓에는 두 주소가 할당되어야한다.IP주소로 컴퓨터를 특정, Port번호로 프로세스를 특정할 수 있다.가장 간단한
velog.io
파일 디스크립터(File descriptor), 소켓 프로그래밍
파일 디스크립터(File descriptor), 소켓 프로그래밍
파일 디스크립터란? 리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 것으로, 운영체제가 특정 파일에 할당해주는 정수값 이다. 유닉스 시스템에서는 일반적인 파일
velog.io
'컴퓨터시스템' 카테고리의 다른 글
프로세스와 스레드 (0) | 2024.02.29 |
---|---|
웹서버와 CGI와 WAS (+ MIME Type) (2) | 2024.02.22 |
메모리 단편화와 메모리 할당 정책 (0) | 2024.02.07 |
GCC(GNU Compiler Collection)란? (0) | 2024.02.01 |
C언어) 포인터와 주소 연산자 (0) | 2024.01.26 |