[42SEOUL] get_next_line

말차·2022년 7월 14일
0

42SEOUL

목록 보기
1/3
post-thumbnail

👀시작 전

1) fd(file discripter)

리눅스 시스템에서는 각 프로세스마다 별도의 파일 디스크립터 테이블을 가지고 있다. 이 테이블에는 파일에 대한 상태 flag와 파일 테이블 요소의 위치 정보(포인터)를 포함하고 있다

커널은 열려있는 모든 파일들을 관리하는 파일 테이블을 가지고 있다. 이 테이블에는 파일의 상태 flag, 파일의 작업 offset, 파일의 vnode 테이블의 위치 정보를 포함하고 있다. 이 vnode 테이블의 각 항목은 파일의 inode 정보와 파일의 크기를 포함한다.

하나의 프로세스에서 같은 파일을 두 번 열었을 때의 파일의 데이터 구조는 아래와 같다. 별도로 fd가 부여되고 이에 따른 파일 테이블의 오프셋 또한 별개이다. 하지만 동일한 vnode를 참조하고 있다.

참고로 해당 프로세스의 fd 번호는 커널이 부여한다.

OPEN_MAX는 fd의 최대값이다. 즉, 하나의 프로세스 당 최대 OPEN_MAX개의 파일을 열 수 있다. 터미널에서 getconf 명령을 통해 확인할 수 있다.

getconf OPENMAX //결과값 나옴

fd 제한과 관련된 내용은 해당 블로그를 참조하면 좋다 : https://lowlevel.tistory.com/3

2) static variable

static으로 정의된 변수는 프로그램이 끝날 때까지 실행 값을 가지고 있다. 사용된 함수를 벗어났다고 사라지거나 하지 않는다. 메모리에서 data 영역에 저장되기 때문이다.
메모리 구조 관련 : http://www.tcpschool.com/c/c_memory_structure

🏁start

gnl함수에서는 기본적인 부분을 확인하고 전체적 코드의 시작과, 결과를 리턴하는 부분을 담당하고 있다. table, 즉 fd에 해당하는 파일의 전 문자열을 저장하는 배열로 static으로 지정하여 실행 도중 다른 파일을 호출하더라도 이전의 파일을 읽던 값들을 저장하고 있을 수 있다.

get_line함수는 말 그대로 줄을 가지고 온다. 우선 이미 줄내에 개행이 있다면 바로 이를 추출하여 이를 리턴하도록 하였고 그렇지 않다면 개행을 찾을 때까지 돌도록 하였다. 즉, 해당 while문은 개행이 있거나, 혹은 도중 문제가 생기거나 파일이 끝났을 때에만 탈출이 가능하다. while문내에서는 buffer_size만큼 파일에서 읽어오는 값을 계속해서 table에 저장된 값과 이어준다.

before-extract 함수에서는 본격적으로 개행전까지 추출하기 전에 상황별로 케이스를 나눈 부분이다. 에러가 발생하거나 파일이 끝난 경우, 개행은 없는데 파일은 끝난 경우(개행은 없지만 문자열은 table에 남아있다), 개행이 있는 경우로 나뉜다. 즉, 모든 파일이 개행이 있었다면 첫 번째 if에서 아니면 2번째 if에 도달할 것이다.

이후 extract 함수에서는 개행까지 추출하고 나머지를 다시 table에 저장하는 부분이다.

해당 과제는 포인터배열때문에 좀 헤맸다. 뚜비두바밥...

char	*get_next_line(int fd)
{
	static char	*table[OPEN_MAX + 1];
	char		*arr;
	char		*res;

	if (fd < 0 || fd > OPEN_MAX || BUFFER_SIZE < 1)
		return (0);
	arr = (char *)malloc(sizeof(char) * BUFFER_SIZE + 1);
	if (!arr)
		return (0);
	if (!table[fd])
		table[fd] = ft_strdup("");
	res = get_line(fd, arr, &table[fd]);
	free(arr);
	arr = 0;
	return (res);
}

👏참고 블로그

https://ehpub.co.kr/tag/파일-디스크립터-테이블/
https://code4human.tistory.com/m/123
그리고 과제를 한 방에 이해하게끔 도와준 분이 계신데 그 분의 블로그를 찾지 못하겠다ㅠㅠ그 분의 코드를 한 번 읽고 코드를 짰었다

0개의 댓글