get_next_line

파일 입출력, static 변수

다음의 기능과 형식을 가진 get_next_line 함수를 구현하는 과제이다.

// 입력값 : 파일 디스크립터
// 반환값 : 파일로부터 문장 하나를 추출하여 반환.
// n번째로 get_next_line을 호출하면 파일의 n번째 문장을 반환한다.
char *get_next_line(int fd);

개요

read 시스템 콜은 지정한 버퍼 크기만큼 데이터를 읽어오지만, 줄 단위로 정확히 끊어주지는 않는다. get_next_line은 이 버퍼 입력을 내부적으로 누적하면서 개행 문자(\n)를 기준으로 한 줄씩 잘라 반환하는 함수다. 호출할 때마다 다음 줄을 반환하며, 파일의 끝에 도달하면 NULL을 반환한다.

한 번의 read로 여러 줄이 읽힐 수도 있으므로, 현재 줄을 반환한 뒤 남은 데이터를 다음 호출까지 보존하기 위해 static 변수를 사용한다.

/42_innercircle_course/get_next_line/ 경로의 tester.c 파일을 참조하여 tester 파일을 실행하면 get_next_line의 동작을 확인할 수 있다.


구현 내용

버퍼 누적 및 줄 분리
read로 데이터를 읽어 static 변수에 누적하고, 개행 문자가 나타나면 그 앞까지를 반환값으로 잘라낸다. 잘라내고 남은 데이터는 static 변수에 보존하여 다음 호출에서 이어서 처리한다.

EOF 및 에러 처리
파일의 끝에 도달하면 마지막 줄(개행 없이 끝나는 경우 포함)을 반환하고, 이후 호출에서 NULL을 반환한다. read 에러 발생 시에도 NULL을 반환한다.

보너스: 멀티 파일 디스크립터 동시 처리
보너스에서는 여러 파일 디스크립터를 번갈아 읽는 상황을 처리한다. static 변수를 파일 디스크립터 인덱스 기준의 배열로 관리하여, 서로 다른 fd의 잔여 버퍼가 섞이지 않도록 한다.