[Pipex] 사용가능 함수 - perror, strerror, exit

Yejin Kim·2022년 5월 20일
0

42 cursus

목록 보기
7/20

서브젝트 목표

Pipex 과제는 pipe를 다루는 방법에 대해 공부하기 위한 프로젝트이다.
이 프로젝트를 위해 새로 배우는 함수에 대해서 정리해보자 !

NEW functions 👀

error에 대해서 처리할 수 있는 함수에 대해서 알아보자

📍 perror

#include <stdio.h>

void perror(const char *_string_)

오류 메세지를 STDERR로 출력하는 함수
string 이 NULL 또는 NULL을 가리키지 않으면
string : error에 해당하는 메세지\n 와 같이 STDERR에 출력된다.

이 함수는 확인하고 싶은 라이브러리 함수 뒤에 바로 사용해야 한다.

해당 라이브러리 함수에서 에러 발생시 그 에러에 맞는 errno가 세팅되고,
perror 함수를 호출하면 현재 errno에 맞는 error message가 출력
이 된다.

따라서 라이브러리 함수 사용 직후에 사용하지 않으면 다른 상황에 의해 errno가 변경될 수 있어 원하지 않는 결과가 나올 수 있다 !

- 라이브러리 함수 사용 -
perror("ERROR MESSAGE : ");

위와 같이 코드를 작성했을 때 라이브러리 함수에서 에러가 발생했다면 다음과 같은 출력이 진행된다

ERROR MESSAGE : errno에 해당하는 message

📍 strerror

#include <string.h>

char *strerror(int errnum)

오류 메세지 string에 errnum의 오류 번호를 mapping 한다.
이 함수는 인자로 넘겨준 errno에 대한 오류 메세지를 반환한다.

printf("%s\n", strerror(errno));

위와 같이 사용하면 errno라는 수에 대응하는 error message가 strerror에 의해 return되고 그 메세지를 출력할 수 있게 된다.

📍 exit

#include <stdlib.h>

void exit(int status)

process를 즉시 종료시켜주는 함수
open된 file descriptor는 모두 close되고 buffer도 모두 지워준다


exit과 메모리 해제에 관한 사담

exit 함수에 대해서 정리하면서 다른 카뎃분과 많은 얘기를 나눴는데, 이에 대해서도 같이 정리를 해보고자 한다 !

42 과제에서는 메모리 해제가 정말 중요한데 (메모리 누수가 하나라도 난다면 아무리 과제를 잘 짰어도 0점이다..)
exit을 하는 경우 OS 단에서 메모리를 회수해주기 때문에 "그 전에 메모리를 안해도 괜찮다", 아니면 "그렇더라도 메모리를 다 해주는게 맞다"로 의견의 많이 나뉜다.

사람들마다 의견이 정말 천차만별이지만 여러 평가를 거치고, 다른 분들과 의견을 나눈뒤 정립한 내 의견은 다음과 같다.

exit을 하더라도 exit(EXIT_SUCCESS)와 같이 정상적으로 코드가 종료되는 케이스라면 메모리 해제를 해주어야 한다.

다만 코드가 특이한 케이스에 의해 비정상적으로 종료된다면 case by case로 프로그래머의 판단 하에 메모리 해제를 일부 하지 않아도 괜찮다.

당연히 비정상종료 시에도 메모리 해제를 해줄 수 있다면 해주는게 좋다고 생각한다.
OS에서 메모리 회수를 해준다고 해서 OS에 너무 기대는 프로그램을 작성하는 것이 좋지 않다는 것이 내 의견이다.

기본적으로 정상 종료나 메모리 해제를 해줄 수 있는 부분은 충분히 프로그램 상에서 처리를 하고 그 후 놓치는 부분이 혹시나 생긴다면 이에 대해서 처리를 해주는게 OS라고 생각하고 프로그램을 작성하는 것이 바른 자세라고 생각하기 때문이다.

다만, 비정상 종료 코드와 같은 케이스의 경우 아직 프로그램에 필요한 모든 메모리가 할당되지 않았을 수 있고, 이런 경우 메모리 해제 시에도 따져야할 케이스가 굉장히 많아질 수 있다.
이 때 모든 비정상 종료에 대한 처리로 인해 코드의 가독성이 현저히 나빠진다면 일부 비정상 종료에 대해서는 exit을 써서 OS의 메모리 해제에 기대는 것도 나쁜 판단은 아니라고 생각한다.
메모리 관리도 프로그래머의 중요한 역량이지만 코드의 가독성을 고려하는 것도 프로그래머의 중요한 역량 중 하나라고 생각하기 때문이다.

그래서 간단히 요약하자면

정상 종료의 케이스는 exit을 사용하더라도 메모리를 모두 해주는 것이 적절하지만,
비정상 종료의 경우 프로그래머가 코드의 가독성과 메모리 관리 간의 밸런스를 적절히 판단해서 코드를 작성하는 것이 좋을 것 같다 !

는 것이 나의 의견이다 !


🦋 pipex repo address

https://github.com/kyj93790/42-cursus/tree/master/pipex

profile
The World Is My Oyster 🌏

0개의 댓글