[GNL] 과제 내용 정리

최별 Choi Byeol·2022년 5월 18일
0

42Seoul

목록 보기
4/6

get_next_line

파일 디스크립터를 받아와 해당 파일에서 개행으로 끝나는 한줄의 문장을 반환하는 함수

간단하게 읽은 파일의 한 줄을 반환하는 프로그램. 시스템이 파일을 열고, 일정한 크기씩 읽어들여서 줄바꿈을 구분하여 파일 내용을 출력하는 함수.

read 함수

  • 헤더: unistd.h
  • 형태: ssize_t read (int fd, void *buf, size_t nbytes)
  • 인수: int fd 파일 디스크립터 void *buf 파일을 읽어 들일 버퍼 size_t nbytes 버퍼의 크기
  • 반환: 정상적으로 파일을 읽었다면: 읽어들인 바이트 수
    파일 읽기에 실패했다면: -1
    파일을 끝까지 읽었다면: 0 (더 이상 읽을 바이트가 없다면 0을 반환. EOF(End of file)을 의미
  • https://badayak.com/4486

버퍼(buffer) 개념

  • 파일을 읽을 때 사용할 임시 공간으로 버퍼 변수를 사용한다.
  • 버퍼(buffer)란 컴퓨터의 주기억장치와 주변 장치 사이에서 데이터를 주고받을 때 둘 사이의 전송속도 차이를 해결하기 위해 전송할 정보를 임시로 저장하는 고속 기억장치다.
  • 버퍼에는 용량이 한정되어 있기 때문에, 오버 플로우 현상이 발생할 수 있다.
  • 표준 입출력함수(scanf, printf 등)는 버퍼를 사용한다.

offset 개념

  • read 함수와 관련해서 offset을 이해할 필요가 있다.
  • read(fd, buf, buffsize)를 수행하면 데이터를 읽은 만큼 offset를 증가시킨다.
  • 다시 파일을 읽으려하면 마지막 읽은 파일 위치부터 읽어들인다.
  • read 함수는 자동으로 끊어진 부분부터 쭉쭉 읽는데, 이유는 파일 디스크립터 테이블(FD Table)에서 읽은 위치(offset)를 저장하기 때문이다.
  • offset은 각 프로세스가 같은 FD를 참조하여 같은 i-node를 참조하더라도, 각자 다른 부분을 읽을 수 있도록 할당한다.

파일 디스크립터(FD)

  • 운영체제가 만든 파일 또는 소켓의 지칭을 편히 하기 위해서 부여된 숫자
  • 기본적으로 파일 디스크립터는 정수형으로 차례로 넘버링 되고 0, 1, 2는 이미 할당되어 있어서 3부터 파일 디스크립터를 부여함.
    • 0 : 표준입력 (Standard Input)
    • 1 : 표준출력 (Standard Output)
    • 2 : 표준에러 (Standard Error)

FD의 최대값은 OPEN_MAX라는 값임.
즉, 하나의 프로세스 당 최대 OPEN_MAX 개의 파일을 열 수 있는데, 이는 플랫폼에 따라 다름.
limits.h에 정의되어 있고, 헤더 추가로 OPEN_MAX 상수를 사용할 수 있으나 실제 fd는 그보다 더 많이 열릴 수 있다는 내용이 있음.. → 따라서 상수값을 사용하여 처리
getconf OPEN_MAX 또는 ulimit -a / ulimit -Sn 으로 확인 가능 → 256으로 확인

BUFFER_SIZE는 컴파일할 때 gcc -d로 설정해주기 때문에 따로 설정하지 않아도 됨.
1024가 가장 효과적인 단위여서 기본 세팅은 1024로 하던지 생략 → 생략

https://www.joinc.co.kr/w/Site/system_programing/File/buffer_size_perf

정적변수(Static Variable)

  • 함수 내에서 사용하는 변수로서 지역변수, 전역변수, 정적변수가 있다. 본 과제에서는 정적변수를 사용할 필요가 있다.
  • get_next_line은 버퍼 사이즈 단위로 파일을 읽고, 한 줄에 해당하는 문자열을 동적할당해야 한다. (한 줄이 얼마나 길지 모르기 때문에 동적할당)
  • 한 줄이 완성되기까지 문자열을 보관할 필요가 있으며, 개행문자 ‘\n’을 기준으로 이후의 문자열도 보관해야 한다.
  • 따라서 함수 안에서 값을 유지시키는 static 변수를 사용한다. 데이터 영역에 저장되어 프로그램 종료 시 까지 남아있기 때문에, 다음 line을 읽을 시작 주소를 계속 저장할 수 있다.
  • 위의 과정을 파일 디스크립터별로 한다면 OPEN_MAX만큼 관리하기 위해서 포인터 배열 변수를 선언해야한다.
profile
FE 👩🏻‍💻

0개의 댓글