Get_Next_Line

pawer·2021년 1월 1일
0

42Seoul

목록 보기
3/6

Subject

문제 이해하기

int get_next_line(int fd, char **line);
  • 입력을 \n로 끊어서 매개변수 line에 저장하도록 구현.
  • 컴파일 옵션에 상수 BUFFER_SIZE의 크기를 지정 함.
  • BUFFER_SIZE단위로 파일을 read하기.

static

참조

static을 사용해야하는 이유 ???

  • get_next_line함수를 하나의 파일 단위로 계속해서 호출한다. (대부분)
  • BUFFER_SIZE만큼 파일을 read하여 \n단위로 line을 저장할 때, 다음 line을 찾기위해 저장한 파일정보가 유지되어야 한다.
    • static을 사용하지 않는다면, 다음 line을 찾을 때 이전에 읽은 BUFFER_SIZE 중 \n이후의 문자를 찾을 수 없다.
    • ex) abc\ndef , BUFFER_SIZE = 5 일 때
      • 최초 read => abc\nd 읽음
      • line에는 abc\n가 저장.
      • 다음 read => ef읽음.
      • line에는 def가 저장되어야 함.
  • 즉, 하나의 프로그램에서 get_next_line을 계속해서 호출할 때 읽은 파일정보를 유지하기 위함.
    • 아래코드 이해하기.
 // test.c
      int     static_test()
      {
          int i = 0;
          static int j = 0;

          printf("i => [%d], j => [%d]\n", i, j);


          i++;
          j++;

          if (i == 5 || j == 5)
              return (0);
          return (1);
      }
      
// main.c

int     main(void)
{
    while (static_test()) {        
    }
    return (0);
}

// result
i => [0], j => [0]
i => [0], j => [1]
i => [0], j => [2]
i => [0], j => [3]
i => [0], j => [4]

동시에 get_next_line함수가 호출되는 경우?

  • 문제가 될 수 있는 부분은, 여러개의 파일 디스크립터가 동시에 get_next_line을 호출하는 경우이다.
    • static으로 사용되는 \n 이전의 파일정보를 담은 데이터가 하나의 프로세스가 종료될 때, 해제된다.
    • 따라서, 파일 디스크립터별로, static정보를 담아주어 동시에 수행되어도 fd단위로 처리될 수 있도록 한다. (이중 포인터 사용)
    • 이 때, 동시에 처리될 수 있는 fd의 최대 갯수는 플랫폼에 따라 MAX값이 정해져있다. posix표준에서는 <unistd.h>에 상수 OPEN_MAX로 정의되어 있다.

fail [1]

  • memory leak 으로인한 fail .. 54점 맞음.
  • read할 때 사용되는 char *buf의 free의 시점이 잘못됬음.
    • read한 경우에만 while에서 free하였음.
    • read가 0이더라도, 코드 시작에서 malloc을 수행하기 때문에, buf가 해제되지않음..
    • 해당부분 수정.

테스터기

  • https://github.com/Tripouille/gnlTester

  • https://github.com/Alexandre94H/gnl-war-machine-v2019

  • https://github.com/charMstr/GNL_lover

0개의 댓글