https://github.com/C4r4c0l3/gnl-war-machine-v2019.git
https://github.com/mrjvs/42cursus_gnl_tests.git
https://github.com/DontBreakAlex/gnlkiller.git
https://github.com/Mazoise/42TESTERS-GNL.git
https://github.com/Tripouille/gnlTester.git
https://github.com/charMstr/GNL_lover.git
int get_next_line(int fd, char **line);
fd
: 파일 디스크립터(참고1, 참고2)line
: 읽어들인 문자열1
: 개행문자까지 한 줄을 읽어들였을 때0
: 파일 끝(EOF)까지 한 줄을 읽어들였을 때static
변수에 개행 문자가 남아 있다면 1
을 반환해야 한다.-1
: 오류 발생gcc -Wall -Wextra -Werror -D BUFFER_SIZE=32
get_next_line.c get_next_line_utils.c
-D BUFFER_SIZE=xx
플래그-D
는 define 옵션으로, 소스 코드 내에서 쓰일 매크로를 컴파일 시에 정의할 수 있다. (#define
과 동일)\n
) 기준line
에 복사)\n
만 있는 경우 처음에는 빈 문자열, 두 번째에도 빈 문자열을 할당한다.)static
변수를 사용해야 하는 이유)static
포인터를 만들고 문자열을 계속 이어 붙인다.static 변수
- 프로그램 실행과 생명 주기가 같다.
- 함수의 실행이 끝나도 값이 유지된다.
- 0으로 자동 초기화된다.
- 정적 전역 변수의 사용 범위는 해당 소스 코드로 제한된다.
static 포인터
- 포인터가 가리키는 주소의 값을 변경할 때, 이전에 할당된 메모리를 해제하지 않으면 누수가 발생한다.
fd
값 유효성 체크OPEN_MAX
값은 플랫폼에 따라 다른데, 현재 리눅스 시스템에서는 deprecated된 상태OPEN_MAX
값이 너무 큰 경우, fd
가 그 범위 내에 있어도 오류가 발생한다.ulimit -n
, getconf OPEN_MAX
: 한번에 열 수 있는 파일 최대 크기 확인 (참고)256
BUFFER_SIZE
read
함수는 반드시 컴파일 시에 정의된 BUFFER_SIZE
를 사용해야 한다.read
1회 실행 시 BUFFER_SIZE
만큼 읽어들인다.read
를 한 번 실행했을 때 읽어들인 버퍼에 개행 문자가 여러 개라면 다음 실행 때 read
를 또 실행하는 것은 비효율적이므로, static
에 저장된 문자열을 먼저 검사하여 실행 여부를 결정한다.BUFFER_SIZE
가 스택 메모리 영역을 넘어서면 segfault가 발생한다.ulimit -s
로 확인8192 kb
== 8388608 b
ssize_t read(int fd, void *buf, size_t count);
fd
: 파일 디스크립터buf
: 읽어들인 데이터를 저장할 메모리 영역count
: 읽어들일 바이트 수0
, 실패 시 -1
을 반환한다.ssize_t: signed size_t
static
변수를 하나만 사용fd
를 동시에 작업할 수 있어야 함OPEN_MAX
크기의 static
포인터 배열 생성fd
와 동일한 인덱스의 배열 요소에 문자열을 저장한다. 참고
https://velog.io/@two_jay/getnextline-tcrgemrf
https://www.notion.so/975319c9434342409073c3d41f8729ab
https://www.notion.so/get_next_line-4d3eba5f5d2d4becb0a2fa058d67c643#56d19da82b7847a89d0eca867a9a2484
https://epicarts.tistory.com/154
https://www.notion.so/42SEOUL-Get_Next_Line-by-junghan-e1f2d44d61974d5bbeaba9ae6f9fa4b1