구현 방법
간략한 방법
- ‘\n’가 포함된 버퍼까지 읽는다.
- ‘\n’의 뒷부분 저장
- 계속 읽는다.
- EOF가 나오면 중단
해결방향
포인터로 해결이 가능한 mandatory 파트와 달리 추가적인 fd를 고려해야 하는 bonus 파트의 경우 해결방법이 둘로 나뉜다.
- 포인터 배열을 활용한 풀이 (주로
OPEN_MAX
) - 가변크기 자료구조를 활용한 풀이 (주로 연결 리스트)
나는 아래의 몇가지 사항을 고려하여 최종적으로 OPEN_MAX
를 활용해서 과제를 수행하였다.
OPEN_MAX 사용
- 문제점
- limits.h 관련
a. 사용자가ulimit -Hn
나ulimit -Sn
를 통해 OS의 fd limit(OPEN_MAX
값)을 변경한다면 함수에 Segmentation fault가 발생할 수 있다. (관련 링크)
b. norminette 문서 위배(허용된 함수의 표준라이브러리 외 include 및 매크로 상수 사용) - 메모리 관련
a. 파일을 한개만 열어서 fd가 한개만 필요한 상황에서도 비효율적으로 RAM을 점유하게 될 수 있다. </br>
- limits.h 관련
- 해결방안
- limits.h 관련
a. 헤더파일에OPEN_MAX
상수를 직접 정의해서 사용 - 메모리 관련
a. mandatory: 배열, bonus:OPEN_MAX
로 해결방식을 다양화 해서 mandatory에서 파일이 한개만 열릴 때의 문제 예방
- limits.h 관련
- 이 방법을 선택한 이유
- 탐색과정의 효율성: fd=n일때의 시간복잡도 → 배열은 값을 바로 찾을 수 있지만 연결리스트는 맨 앞부터 n번째까지 탐색해야 한다.
- fd값의 확률: 연결리스트의 장점인
OPEN_MAX
이상의 값을 처리하는 경우보다 그 이하의 값을 처리는 경우가 훨씬 많다고 판단한다. 범위를 벗어가서 생기는 문제는 gnl함수에서 fd값의 유효성을 체크하는 부분에서 처리한다.