42Seoul

GNL 준비

구현 메소드

int get_next_line(int fd, char **line);

fd

fd는 파일디스크립터의 약자이다.

이는 스트림을 사용하기 위해 붙이는 번호라고 생각하면된다.

기본적으로 운영체제가 자주쓰는 스트림 3개

  • 표준입력 : 0
  • 표준 출력 : 1
  • 표준 오류 출력 : 2

open 함수를 통해 새 스트림을 열어주면 운영체제는 자동으로 기존에 사용하던 스트림 번호에 +1을 하여 이를 해당 스트림의 fd로 부여한다.

 

[참고]

 

OPEN_MAX

 

파일 디스크립터의 최대갓은 OPEN_MAX라는 값이다.

OPEN_MAX는 단일 프로그램에 허용되는 최대 열린 파일 수를 정의하는 상수다.

즉, 하나의 프로세스 당 최대 OPEN_MAX개의 파일을 열 수 있다.

 

OPEN_MAX 값은 플랫폼에 따라 다르다.

Unix 시스템에서 C언어의 OPEN_MAX는 limits.h에 정의되어 있다.

(OPEN_MAX와 FOPEN_MAX와 _SC_OPEN_MAX는 조금씩 다르다고 한다. (출처))

/*OPEN_MAX 알아보기 터미널*/

getconf OPEN_MAX

//결과값
//1024

 

line

line은 함수의 매개변수로 들어가는 포인터이다.

포인터를 매개변수로 사용하는 경우 2가지

  1. 함수의 매개변수로 전달하기에 변수가 너무 클 경우
    • 주로 구조체에 해당한다.따라서 이 변수의 메모리 공간을 가리키는 포인터 변수를 함수의 매개변수로 전달하면 낭비를 막을 수 있다.
    • : 구조체는 여러 유형의 변수를 모아놓고 쓰는 것이므로 크기가 커질 수 있다.
      이를 함수에 그대로 전달할 경우 함수는 해당 변수를 그대로 스택에 복사하여 사용해야 하므로 메모리 낭비가 심해진다.
  2. 함수 내부에서 매개변수로 오는 변수의 값을 함수 내부에서 변경할 수 있다.
    • 포인터란 어떠한 변수의 메모리 주소를 담고 있으므로 이를 전달하면 해당 변수의 값을 함수 내부에서 변경할 수 있다.

이 과제에선 2번의 경우에 해당하여 포인터를 매개변수로 전달하였다.

fd로 부터 파일의 내용을 읽어들이고 개행을 단위로 문자열을 잘라 line에 넣어주는 것이다.
line은 함수 밖에서 선언될 것이고 이를 함수 내부에서 변경해야 한다.

 


반환값 1, 0, -1

1 : 한 줄이 읽혔다.
0 : 파일의 끝에 도달했다.
-1 : 에러가 발생했다.

fd로 부터 제대로 한 문장을 가져왔는지 여부를 -1, 0, 1로 반환한다.

따라서 -1, 0이면 함수는 중간에 return을 시켜서 중단해줘야 할 것이고 1인 경우 제대로 문장 취득이 이루어 졌으니 다음 문장을 출력할 수 있게 준비해둬야한다.

 


read, malloc, free (허용된 외부 함수)

read

read 함수는 int read (int fd, buf, buffer_size); 로 정의된 함수다.

특정 fd로부터 바이트 단위로 내용을 읽어들어와 버퍼에 버퍼사이즈만큼 저장한다.

 

반환값은 읽어들인 바이트 수다. 버퍼사이즈보다 적게 읽어들일 경우엔 읽어들인 바이트 수를 반환한다.

이 시스템 콜은 동작 후에 읽어들인 버퍼만큼 파일 오프셋(스트림이 파일과 연결되어 있는 부분)을 이동시킨다.
따라서 같은 파일 디스크립터에 대해 read() 시스템 콜을 반복해서 호출하면 파일의 마지막에 도달하게 된다.

malloc

malloc은 메모리 공간을 동적으로 할당하는 함수

free

free는 메모리 공간을 해제하는 함수이다.

read는 계속 버퍼사이즈를 최대 크기로 해서 파일이든 stdin이든 입력 소스로부터 읽어들일 것이다.
따라서 반복할 때마다 앞의 읽었던 문장에다가 새로 읽어들인 문장을 붙여줘야한다. 그래야지 개행을 기준으로 문장들을 출력할 원본이 생긴다.

 

 


참고 및 출처

GNL, 하마네 공부모음

'42Seoul' 카테고리의 다른 글

GNL에서 사용한 함수  (0) 2021.02.05
Netwhat  (0) 2020.12.29