article thumbnail image
Published 2022. 9. 22. 14:29

설명에 들어가기 전 후기

프로젝트 이해부터 굉장히 오래 걸린 과제였다.

BUFFER_SIZE만큼 글자를 읽는데, 막상 반환하라는 것은 \n이 나올때까지의 문자열을 반환하라니....

프로젝트 이해는 오래 걸렸지만 방식을 이해하고 나니 구현은 오래 걸리지 않았다.

다양하게 fd를 다루는 bonus를 하고 싶어 연결리스트로 구현하려 했으나, 연결리스트로 구현하는 것이 미숙하여 며칠을 고민한 끝에 포기하고 배열로 구현한 점이 가장 아쉬움이 남는다. 

새롭게 gcc -D 플래그를 알 수 있었고, free를 하며 댕글링 포인터, 그리고 메모리 누수 체크 방법 등을 알 수 있던 과제였다.

앞으로 메모리 누수를 신경쓰며 과제를 해나갈텐데, leak를 본격적으로 해결하는 첫 단계 였다고 생각한다.

평가하는 도중 나의 코드를 좀 더 깔끔하게 만들 방법을 평가자님과 함께 고민한 시간을 가진적이 있다.

평가자님께서 NULL을 검사할 때 내가 주로 사용하던 방식인 if(!check) 이런 식으로 코드를 짜지 말고 if(check == NULL) 이런 방법으로 코드를 작성하면 코드를 좀 더 이해하기 쉬워진다고 하셨다.

또한 함수 이름도 직관적이게 작성하면 함수가 반환하는 값이 있는지, 어떤 기능을 하는지 등등 코드를 작성할 때도, 리뷰할 때도 알기 쉬워진다고 하셨다.

그동안의 코드도 나름 가독성이 있다고 생각하였지만, 더욱더 가독성을 높이는 방법을 알게된 평가 시간을 가졌다.  

 

 

프로젝트 소개

\n을 기준으로 한 줄씩 읽어서 반환하기

 

함수 프로토타입

char *get_next_line(int fd);

반환값

읽혀진 라인

만일, 읽은 라인이 더이상 없거나 에러가 발생할 경우 NULL

 

 

read

파일을 읽는 함수

함수 원형

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t nbytes);

매개변수

int fd : 읽을 파일의 파일 디스크립터

void *buf : 읽어들인 데이터를 저장할 버퍼

size_t nbytes : 읽어들일 데이터의 최대 길이

 

반환값

읽어들인 데이터의 길이

오류 시 -1

 

파일 디스크립터

프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값으로써, 0이 아닌 정수값

-1 : 실패

0 : 표준 입력(stdin)

1 : 표준 출력 (stdout)

2 : 표준 에러 (stderr)

3 ~ OPEN_MAX : open 함수를 통해 열면 3부터 순차적으로 할당. 이때 OPEN_MAX는 플랫폼마다 다름

 

 

gcc -D

매크로를 외부에서 선언할때 사용하는 옵션

 

gcc -D name=value

name : 원하는 변수명

value : 원하는 값 (입력하지 않으면 1로 설정)

 

예시

//main.c

#include <stdio.h>

int main()
{
	printf("%d", test);
    return 0;
}
gcc -D test=42 main.c

컴파일 시 42값을 가진 test라는 변수를 선언했기에, main에서 42가 출력됨

 

static 변수

정적 변수라고도 하며, 전역 변수와 같이 프로그램이 시작될 때 생성 및 초기화 되고 프로그램이 끝날 때 소멸하는 변수

즉, 함수가 종료되더라도 프로그램이 종료될 때 까지 메모리에 값이 저장

초기 값을 지정하지 않으면 0으로 초기화

static 변수는 선언한 파일에서만 호출이 가능하여, 외부참조가 되지 않음 (extern으로 다른 파일에서 호출이 가능한 전역 변수와의 차이)

 

동작 순서

1. buf에 BUFFER_SIZE + 1 만큼 파일에서 문자를 읽어서 저장

2. backup에 buf를 계속 이어붙임

3. 파일 끝까지 or \n값이 나오기 전까지 1, 2 과정을 반복

4. backup에는 \n 이후의 값을 저장

5. \n 까지의 문자열을 반환

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

[42 Seoul] minitalk  (0) 2023.01.05
[42 Seoul] so_long  (0) 2022.11.17
[42 Seoul] Born2beroot - Bonus  (0) 2022.09.06
[42 Seoul] Born2beroot - sudo, ufw, ssh, cron  (0) 2022.09.05
[42 Seoul] Born2beroot - User, Hostname, Partitions  (0) 2022.09.05
복사했습니다!