[get_next_line] 파일디스크립터에 대해 알아보자

개발하는 곰댕이·2021년 4월 11일
0

42Seoul

목록 보기
11/45

1. 파일디스크립터(File Descriptor)는 뭘까??

  • 파일 디스크립터는 간단하게 보자면 파일을 관리하기위해 매겨놓은 숫자입니다.
    이 숫자는 일반적인 상황에서는 음수가 될 수 없고, 기본적으로 0, 1, 2는 프로그램이 시작될 때 기본적으로 표준입력, 표준출력, 표준에러로써 사용되고,
    그 이후에 파일을 사용하게 된다면 사용되지 않은 숫자 중에서 가장 작은 숫자가 fd로 부여됩니다.
    만약 잘못된 파일에 접근한다면 일반적인 상황이 아니기에 파일디스크립터는 -1로써 에러가 나게 됩니다.

  • 간단한 예시를 봅시다.

int main(void)
{
    int fd_1;
    int fd_2;
    
    fd_1 = open("a.out", O_RDONLY);
    printf("fd_1 = %d\n", fd_1);
    fd_2 = open("a.out", O_RDONLY);
    printf("fd_2 = %d\n", fd_2);
}

fd_1 = 3
fd_2 = 4

첫 번째 파일을 열었을때의 fd_1은 3, 그 다음 열었을때의 fd_2는 4가 된다. 이런 식으로 순서대로 숫자가 부여되고,
만약 이전에 사용된 파일디스크립터가 풀린다면 어떻게 될까요??

int main(void)
{
    int fd_1;
    int fd_2;
    
    fd_1 = open("a.out", O_RDONLY);
    printf("fd_1 = %d\n", fd_1);
    close(fd_1);
    fd_2 = open("a.out", O_RDONLY);
    printf("fd_2 = %d\n", fd_2);
    close(fd_2);
}

fd_1 = 3
fd_2 = 3

위 내용처럼 사용되고 있지 않은 숫자중 가장 작은 숫자가 파일디스크립터로 부여되기 때문에 fd_2도 3번으로 되는 걸 알 수 있습니다.

이런 식으로 3, 4, 5 처럼 차례대로 부여되다가 3번이 다 사용되었다면 3, 6, 7 이런 식으로 사용되지 않는 숫자 중 가장 작은 숫자가 됩니다.

2. GNL에서 fd사용하기

  • 그러면 우리는 fd를 왜 알아둬야할까요?? 그냥 fd로 파일을 읽기만 하면 되는거 아닌가??
    보너스를 하지 않는다면 그렇겠지만 만약 보너스를 한다면 이야기가 다릅니다.
    gnl은 파일에서 개행을 만날 때 까지 한 줄을 읽어들여서 매개변수로 들어온 line에 직접 할당을 해 준다. 여기까진 간단합니다.
    하지만 만약 read로 한 번에 읽어들이는 문자의 수가 15인데 개행까지의 문자열의 길이는 10이라면?? 나머지 5개의 문자는 정적변수에 저장을 해 두고 다음에 꺼내서 써야합니다. 근데 다음에 읽어들일 파일이 계속 달라진다면?
    이런 상황이 나오기에 fd를 인덱스처럼 사용해서 이전에 저장해둔 문자들을 마저 사용하게 됩니다.

[get_next_line] get_next_line에 대해 알아보자.
[get_next_line] 파일디스크립터에 대해 알아보자
[get_next_line] 정적변수, static variable에 대해 알아보자
[get_next_line] get_next_line! 어떤 식으로 구현해야할까?

0개의 댓글