[42seoul]get_next_line

werthers·2023년 4월 20일
0

42서울

목록 보기
4/7
post-thumbnail

GNL 시작하기 전에 알아두면 좋을 정보

  • Bonus part를 구현하고 싶다면 list로 사용할 것을 감안하고 코드를 구현해야한다.
  • norminette을 지키며 list로의 구현과 메모리를 완벽하게 관리하기는 쉽지 않다.

우선 mandatory part를 구조체로 구현하게 되면 bonus part를 구현할 때 변경하기 편리하다.

typedef struct s_list
{
	char *line;
}	t_list
//mandatory part
typedef struct s_list
{
	char *line;
    int	 fd;
    struct s_list *next;
}
//bonus part

과제 설명

본 과제는 libft를 사용하지 않고 10개의 함수로 file을 한 번에BUFFER_SIZE만큼 읽어들여 개행 단위로 리턴해주고 개행 이후의 부분을 정적 변수에 담아두었다가 다음 호출 때 다음 개행을 리턴하는 방식이다.
ex) a.txt "a\nbbb\ncccccccc\n", BUFFER_SIZE가 5일 때
gnl은 a\nbbb를 한 번 읽고 개행이 존재하는지 검사 후
a\n은 리턴 bbb는 정적 변수에 보관해둔다.
다음 호출시 bbb를 담고 있는 정적 변수에 개행이 존재하는 지 검사 후 존재하지 않기 때문에 BUFFER_SIZE만큼 다시 읽어 bbb\ncccc를
가지고 bbb\n을 리턴 한 후 cccc를 정적 변수에 보관해둔다.

보너스 파트 설명

여러 개의 fd를 동시에 열어 gnl을 수행하는 함수를 만들면 된다.
정적 변수를 하나만 가져야 한다는 제한이 있다.

구현 방법

  1. BUFFER로 읽어들여서 개행을 찾을 때까지 파일을 읽어서 담는다.
  2. 개행이 찾아질 때까지 BUFFER를 이어붙여 realloc한다.
  3. 개행이 담긴 line을 개행 전 후로 나누어 담아 개행까지의 부분은 return, 후 부분은 정적 변수에 담아주면 된다.

주의 사항

read의 에러 발생 시, memory 할당 오류, realloc 시 memory leak 발생 등 나타날 수 있는 에러들을 잘 제어 해야한다.

Bonus part를 list 구조체를 사용하게 된 이유

  • limits.h에 정의된 매크로인 OPEN_MAX는 디펜스에서 논란의 여지가 있을 수 있다.
  • OPEN_MAX에 정의된 숫자보다 더 큰 fd를 열 수 있음에도 fd를 OPEN_MAX까지 제한하는 것이 맞는가는 공격에 마땅히 디펜스 할 말이 없다. fd를 변경하여 열 수 있는 함수로 쉽게 확인이 가능하다.
    물론 실제 사용 용도로는 배열이 성능, 구현면에서 좋다.

구현 방법별 정리

정적 배열 구현 : 구현, 메모리 관리 쉽고 성능도 좋지만 fd를 제한한다는 점에서 디펜스에 심혈을 기울일 필요가 있다.
리스트 구현 : 가변적인 데이터 구조를 사용하기 때문에 fd에 제한을 두지 않지만 성능이 조금 안좋고 메모리 관리에 주의를 기울여야한다.
해시맵 구현 : key로 fd를 사용하여 배열과 같은 성능을 보여줄 수 있지만 함수 10개 * 25줄로 구현하긴 어렵다고 생각한다.
물론 괴물들은 존재하겠지만

profile
Hello World !

0개의 댓글