읽어온 파일을 개행문자 기준으로 한 줄씩 반환하는 함수
Unix
시스템에서 프로세스가 열린 파일들에 접근할 때 사용하는 개념으로, 열린 파일을 가리키는 고유한 값이다.Unix
시스템에서는 파일뿐만 아니라 디렉토리, 소켓 등 모든 객체들을 파일로써 관리한다.File descriptor
는 음이 아닌 정수
로, OPEN_MAX
까지 존재한다.OPEN_MAX
는 단일 프로그램에 허용되는 열린 파일의 최대 개수를 정의하는 상수이다.Unix
시스템에서 C언어의 OPEN_MAX
는 limits.h
에 정의되어 있다.Default input/output streams
File descriptor
중에서 사용하지 않는 가장 작은 값을 할당한다.main
이 아닌 함수에서 변수를 선언하는 경우 해당 함수가 종료되어도 변수가 해제되지 않는다.#include <stdio.h>
void func() {
static int x = 0;
x++;
printf("%d\n", x);
}
int main() {
func(); // 출력값: 1
func(); // 출력값: 2
func(); // 출력값: 3
func(); // 출력값: 4
func(); // 출력값: 5
return 0;
}
func
함수가 종료된 후 다시 호출되어도 x
는 0
으로 초기화되지 않고 이전의 값을 가지고 있다.static
변수, 전역변수, 함수는 정의된 C파일이 아닌 외부에서는 사용할 수 없다. ssize_t read(int fd, void *buf, size_t count)
File Descriptor
fd
를 count
만큼 읽어 buf
에 저장하는 함수이다.-1
, EOF(End Of File)
에 도달했다면 0
을 반환한다. read(fd, NULL, 0);
File Descriptor
의 유효성을 검사할 수 있다. 파일에서 문자를 읽어오지는 않는다.gcc -D name=definition
의 형태로 사용된다name
에 원하는 변수명을, definition
에 값을 적고 컴파일을 하면 코드를 실행하기 전 name
을 미리 정의한 후 값을 할당한다.get_next_line
에서는 gcc -Wall -Wextra -Werror -D BUFFER_SIZE=xx <files>.c
로 사용된다.static
을 활용linked list
의 첫 번째 노드가 static
, 함수가 종료되어도 head
에 접근 가능케 함head
만 살아있다면 모든 노드에 접근 가능함File descriptor
는 음이 아닌 정수0
이하일 경우 문자를 버퍼에 저장할 수 없음read(fd, NULL, 0)
으로 유효한 fd
인지 확인하는 것은 read_file()
에서도 확인 가능하기에 굳이 넣지 않음 linked list
에서 현재 입력받은 fd
값을 가진 노드를 가져옴⚠️
buf
나line
할당 실패 시ft_lst_del_noed()
로 현재 노드를 해제하고NULL
반환 ⚠️
fd
만 다룸fd
는 입력받은 fd
와 동일하므로 해당 노드를 반환buf
는 빈 문자열로 초기화NULL
반환norminette
규정을 맞추기 위해 read_file()
밖에서 할당 및 해제를 진행cur->buf
에 \n
이 존재하면 파일 읽기를 진행하지 않고 한 줄 반환을 진행next
변수에 저장하여 get_line()
함수에 전달 strjoin
을 이용해 합친 후 cur->buf
에 새로 저장\n
이 있거나, 파일을 끝까지 읽은 경우(byte < BUFFER_SIZE) 한 줄 반환next
가 NULL
일 때NULL
반환line
에 복사next
가 NULL
이 아닐 때line
에 복사save_next()
함수 호출line
해제 후 NULL
반환line
반환next
가 NULL
일 때next
가 NULL
이 아닐 때cur-buf
의 개행 다음부터 끝까지 저장0
반환cur->buf
에 저장cur-buf
가 빈 문자열인 경우 파일의 끝까지 읽었다는 의미이므로 ft_lst_del_node()
를 호출, 현재 노드 삭제1
반환buf
를 먼저 해제한 후 노드 자체의 메모리 해제
get_next_line()
은 메모리의 적절한 할당 및 해제가 중요한 과제라고 생각하여 이차원 배열로 구현하려 했으나,OPEN_MAX
파훼법이 여럿 존재한다는 점에서 안전한 디펜스를 위해linked list
로 구현함
get_fd()
함수 외에는 모두 동일
fd
를 다루어야 하기 때문에, 입력 받은 fd
값을 가진 노드를 찾는 과정이 추가됨. 이 외에는 Mandatory Part와 동일