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을 계속해서 호출할 때 읽은 파일정보를 유지하기 위함.
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);
}
int main(void)
{
while (static_test()) {
}
return (0);
}
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가 해제되지않음..
- 해당부분 수정.
테스터기