읽어온 파일을 개행문자 기준으로 한 줄씩 반환하는 함수
Unix 시스템에서 프로세스가 열린 파일들에 접근할 때 사용하는 개념으로, 열린 파일을 가리키는 고유한 값이다.Unix 시스템에서는 파일뿐만 아니라 디렉토리, 소켓 등 모든 객체들을 파일로써 관리한다.File descriptor는 음이 아닌 정수로, OPEN_MAX까지 존재한다.OPEN_MAX는 단일 프로그램에 허용되는 열린 파일의 최대 개수를 정의하는 상수이다.Unix 시스템에서 C언어의 OPEN_MAX는 limits.h에 정의되어 있다.Default input/output streamsFile 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와 동일