#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
 
int main(void) {
    int fd1, fd2, fd3;
 
    fd1 = socket(PF_INET, SOCK_STREAM, 0);
    fd2 = open("test.dat", O_CREAT | O_WRONLY | O_TRUNC);
    fd3 = socket(PF_INET, SOCK_DGRAM, 0);
 
    printf("file descriptor 1: %d\n", fd1);
    printf("file descriptor 2: %d\n", fd2);
    printf("file descriptor 3: %d\n", fd3);
 
    close(fd1);
    close(fd2);
    close(fd3);
 
    return 0;
}


파일 디스크립터(File Descriptor)

- 운영체제가 만든 파일 또는 소켓을 지칭하기 위해 부여한 숫자

- 파일을 관리하기 위한 운영체제가 필요로 하는 파일의 정보를 가지고 있다. FCB(File Control Block)이라고 하고 다음의 정보를 가진다.


1) 파일 이름

2) 보조 기억 장치에서의 파일 위치

3) 파일 구조 : 순차 파일, 색인 순차 파일, 색인 파일

4) 액세스 제어 정보 

5) 파일 유형

6) 생성 날짜와 시간, 제거 날짜와 시간

7) 최종 수정 날짜 및 시간

8) 액세스한 횟수


- 파일 디스크립터는 정수형으로 차례로 부여되고 0, 1, 2는 이미 할당되어 있어서 3부터 부여된다.


파일 디스크립터 

대 상 

 0

 표준입력: Standard Input

 1

 표준출력: Standard Output

 2

 표준에러: Standard Error


파일 디스크립터와 소켓

- 리눅스 환경에서는 소켓조작과  파일조작이 동일하게 간주되기 때문에 자세히 알 필요가 있다.

- 리눅스는 소켓을 파일의 일종으로 구분하여 파일 입출력 함수를 소켓 데이터 송수신에 사용할 수 있다.


리눅스 환경에서 소켓 & 파일입출력의 파일 디스크립터 예시


fd_seri.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
 
int main(void) {
    int fd1, fd2, fd3;
 
    fd1 = socket(PF_INET, SOCK_STREAM, 0);
    fd2 = open("test.dat", O_CREAT | O_WRONLY | O_TRUNC);
    fd3 = socket(PF_INET, SOCK_DGRAM, 0);
 
    printf("file descriptor 1: %d\n", fd1);
    printf("file descriptor 2: %d\n", fd2);
    printf("file descriptor 3: %d\n", fd3);
 
    close(fd1);
    close(fd2);
    close(fd3);
 
    return 0;
}


- 실행결과


2428963458612AF217



실행결과에서 보이듯이 파일 입출력 함수인 open과 socket 둘중 어떤 것을 써도 파일 디스크립터가 순차적으로 증가하는 것을 알 수 있다.




출처: https://dsit.tistory.com/2 [일상IT]