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

- 컴퓨터가 파일들을 관리하기 위해 지정해 놓은 숫자

- 일반적으로 [ 0, 1, 2 ] 는 이미 지정되어 있다!

0 : 표준 입력

1 : 표준 출력

2 : 표준 에러

3... : 사용자가 사용하는 파일을 최소숫자로 부여!

 

⚠️ 만약 잘못된 파일에 접근할경우 -1 을 반환한다! ⚠️

 

간단한 예로 fd 값을 살펴보자구요!

살펴보기 전에 먼저 open 함수를 간단히 알아봅시다!

* OPEN 함수란?
- 이미 생성되어 있는 파일 또는 새로운 파일을 생성하는 System call 함수!
open 함수를 사용하기 위해서는 flag 를 반드시 사용해야 합니다!
O_RDONLY : 파일을 읽기 전용으로 open합니다.
O_WRONLY : 파일을 쓰기 전용으로 open합니다.
O_RDWR : 파일을 읽고 쓰기를 모두 할 수 있도록 open합니다.

출처: https://www.it-note.kr/19 [IT 개발자 Note]

fd 값을 사용하기 위해 우리는 O_RDONLY 플래그만 사용해서 fd값을 살펴 보도록 해요!

먼저 우리는 임의의 파일 하나는 생성해 주자구요! 

touch 명령어를 통해 비어있는 파일 "hello" 를 만들어 줍니다!

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;
        
    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);
}

그리고 간단한 코드 작성을 통하여 fd 값을 확인해 보자구요!

위에서 설명한대로 0 ~ 2 까지는 표준입력, 표준출력, 표준에러 로 이미 선점해 있기 때문에

파일 디스크립터 값은 3이 할당된걸 알수있죠!

 

그렇다면 올바르지 않은 파일이 들어왔을때 fd 값을 확인해 볼까요?

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;

    fd = open("hello_error", O_RDONLY);
    printf("hello_error 파일의 fd값 = %d\n", fd);
}

우리는 "hello" 라는 파일은 만들었지만 "hello_error" 라는 파일은 가지고 있지 않습니다!

그렇다면 해당 파일을 읽으려고 할때, fd 값은 어떻게 될까요?

위에 설명한대로 정말 -1을 반환하게 되네요!

 

그럼 여러개의 파일을 읽을때, fd 값은 어떻게 할당 될까요?

hello 하면 자연스레 따라오는.. world 라는 파일을 새로 만들어 줬습니다!

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;
    int fd_2

    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);
    
    fd_2 = open("world", O_RDONLY);
    printf("world 파일의 fd값 = %d\n", fd_2);
}

해당 값의 결과를 확인해보면

정말 순서대로 3 과 4 가 할당되네요!!

 

* 파일을 사용하고 난후 더이상 파일을 사용하지 않는데, 이런경우 fd 에서 제거할순 없나요?

--> 우리가 메모리 동적할당을 하기위해 malloc 함수를 사용하고 난후, free 함수를 통하여 해당 메모리를 해제해 주잖아요!?

open 함수도 이와 비슷한 함수가 존재합니다!

바로 close 함수 인데요!

 

close 함수는 " 나는 더이상 이파일을 사용하지 않고 접근도 하지 않을거야 그러니까 파일 디스크립터에서 제거해줘 "

정도로 생각하시면 될것 같아요!!

 

간단한 코드로 살펴봐요!

 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd;
    int fd_2;

    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);

	close(fd);
	printf("hello 파일 close\n");

    fd_2 = open("world", O_RDONLY);
    printf("world 파일의 fd값 = %d\n", fd_2);
}

자 이렇게 하고 난후 각각의 fd 값을 확인해보면!

hello 파일의 디스크립터가 3으로 선점되었지만

close 함수를 통하여 디스크립터에서 제거하고 world 파일을 디스크립터에 할당할때 

제일 적은숫자, 그러니까 3으로 할당됨을 볼수 있네요!

+ Recent posts