[42Seoul] GNL
TOC
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을 수행하는 함수를 만들면 된다. 정적 변수를 하나만 가져야 한다는 제한이 있다.
구현 방법
- BUFFER로 읽어들여서 개행을 찾을 때까지 파일을 읽어서 담는다.
- 개행이 찾아질 때까지 BUFFER를 이어붙여 realloc한다.
- 개행이 담긴 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줄로 구현하긴 어렵다고 생각한다. ~~물론 괴물들은 존재하겠지만~~