※ 파일디스크립터 ( 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으로 할당됨을 볼수 있네요!