[소켓 프로그래밍] 파일 디스크립터

minji·2021년 8월 6일
0

파일 디스크립터란?

파일 디스크립터란 시스템(운영체제)이 특정 파일에 할당해준 정수값을 의미한다.

이는 우리가 흔히 알고 있는 파일뿐 아니라 소켓과 같은 자원도 가지고 있는값이다. 예를 들어 소켓을 생성하는 socket() 함수, 연결을 수락하는 accept() 함수 모두 파일 디스크립터 값을 반환한다.

우리가 자주 사용하는 표준입출력은 이미 파일 디스크립터 값이 할당되어 있으며, 아래와 같다.

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

표준입출력에서 0~2까지의 정수를 고정받아 사용하고 있으니, 이외의 파일에 할당되는 파일디스크립터 값은 정수 3부터 가능하다.

파일 디스크립터 값의 할당

그렇다면 파일 디스크립터 값은 어떻게 할당받을 수 있을까?
먼저, 사용자 지정 파일을 읽거나 쓰는 경우에는 open() 함수를 이용해 파일 디스크립터 값을 할당받을 수 있다.

int fd = open("test.txt", O_WRONLY);

위와 같이 읽을(쓸) 파일명, 파일을 읽을(쓸) 때 사용할 옵션 두가지를 open() 함수의 파라미터로 지정해 호출하면 고유한 fd값이 반환값으로 주어진다.

따라서 이후부터는 "test.txt" 파일에 접근할 때 이 fd값을 사용할 수 있고, 파일마다 하나의 접근지정자가 생기는 효과를 가져오므로 보다 편하게 원하는 파일에 접근이 가능하다.

이를 이용해, test.txt 파일에 "Hello Socket Programming" 이라는 문자열을 쓰고 이를 다시 읽는 코드를 작성해보자.

1. file write (C언어)

-> write 함수를 이용해, buf의 데이터를 "test.txt" 쓸 수 있다.

2. file read

-> read 함수를 이용해, test.txt 파일을 읽기모드로 읽을 수 있다.

위 두 코드에서의 정수값 fd가 바로 파일 디스크립터에 해당하며, test.txt 파일에 해당하는 디스크립터값을 갖는다.

다음은 터미널을 통해 이를 실행해보자.

gcc low_open.c -o lopen
-> low_open.c 파일을 컴파일 후 실행파일을 생성한다. 실행파일의 이름은 lopen이다.

./lopen
->생성한 실행파일을 작동시킨다. 즉, test.txt 파일을 생성하고 데이터를 입력한다.

gcc low_read.c -o lread
-> 마찬가지로, low_read.c의 실행파일을 생성한다.

./lread
-> lread파일을 작동시킨다. 즉, test.txt 파일을 읽는다.

read / write 예시를 통해 파일 디스크립터의 개념에 대해 알아보았다. fd값을 할당받으면, 이를 이용해 해당파일에 접근할 수 있다는 것을 알았으니 이를 소켓에도 적용할 수 있다.

소켓을 이용해 네트워크 간 통신을 하는 경우에도 마찬가지로 파일 디스크립터를 이용한다.
데이터 파일에서 open() 함수를 통해 fd 값을 할당받았던 것처럼, 소켓에서는 socket() 함수, 그리고 accept() 함수를 통해 할당받을 수 있다.

이에 대해서는 다음 포스트에서 공부해보자.

** 윤성우의 열혈 TCP/IP 소켓 프로그래밍을 토대로 공부하며 정리한 글입니다

profile
SW Engineer

0개의 댓글