본문 바로가기

컴퓨터시스템

파일 디스크립터란? (File Descriptor)

728x90

 

  파일 디스크립터란

파일 디스크립터는 리눅스, 유닉스 계열의 시스템에서 프로세스가 파일에 접근할 때 이용하는 개념입니다.

유닉스 시스템에서는 모든 것이 파일입니다. 우리가 아는 일반적인 파일부터 디렉토리, 소켓, 파이프 등 모든 객체가 파일로서 관리됩니다. 이 파일들에 접근할 때 파일 디스크립터를 이용합니다.

 

프로세스는 특정 파일에 접근할 때 커널로부터 사용할 정수값을 할당 받습니다. 

정확히는 운영체제 커널이 프로세스에게 파일에 접근할 수 있는 인덱스를 할당해주는데 이 인덱스를 파일 디스크립터라고 하며, 파일 디스크립터 인덱스로 이루어진 테이블이 존재합니다.

 

프로세스가 파일을 열면 커널은 파일 디스크립터의 남아있는 숫자 중 가장 작은 값을 할당해줍니다. 이 후부터는 프로세스가 파일에 접근할 때, FD 값을 이용해 파일을 지칭할 수 있습니다.

파일 디스크립터는 0이 아닌 양의 정수값으로 이루어져 0 ~ OPEN_MAX 값을 가질 수 있으며, OPEN_MAX값은 플랫폼마다 다릅니다.

 

프로그램이 프로세스로 실행될 때, 기본적으로 할당되는 파일 디스크립터가 있습니다.

  • 표준 입력 (Standard Input) : 0  |  STDIN_FILENO
  • 표준 출력 (Standard Output) : 1  |  STDOUT_FILENO 
  • 표준 에러 (Standard Error) : 2  |  STDERR_FILENO

각각 앞의 정수값이 할당되며 뒤의 매크로로 참조할 수 있습니다.

 

 


 

출처 - https://dev-ahn.tistory.com/96

 

위 그림을 보면 FD가 단순 인덱스임을 확인할 수 있습니다. 각 프로세스는 맨 왼쪽의 FD 테이블을 갖고 있고, FD 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 갖고 있습니다. 이 포인터를 이용해 시스템의 파일을 참조할 수 있습니다. 프로세스는 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없고, 반드시 커널을 통해서 수정해야 합니다.

 

 

 


 

  파일 디스크립터 할당 받기

사용자 지정 파일을 읽거나 쓰는 경우 open() 함수를 사용해 할당 받을 수 있습니다.

int fd = open("hello.txt", O_RDWR);

 

파일명과 사용할 옵션을 매개변수로 지정해 호출하면 해당 파일의 FD값이 반환값으로 주어집니다. 해당 반환값으로 파일에 접근이 가능합니다.

 

옵션은 O_RDONLY | O_WRONLY | O_RDWR , 각각 읽기 전용, 쓰기 전용, 읽기쓰기 옵션입니다.

 

터미널에서 프로세스에서 사용중인 FD 목록을 확인할 수 있습니다.

프로세스에서 사용중인 FD 확인하기

 

 

 

일반 파일과 같이 소켓 네트워크 통신을 하는 경우에도 파일 디스크립터를 이용합니다. 소켓 프로그래밍에서는 socket(), accept() 함수를 통해 소켓의 FD를 할당받을 수 있습니다.

int sock_num = socket(AF_INET, SOCK_STREAM, 0);

 

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