C언어/stdio.h

[C언어] perror 함수 (stdio.h)

아무일도없었다 2022. 9. 6. 23:53

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 errno 에 설정된 오류를 stderr 로 출력할때 사용한다.

헤더

#include <stdio.h>

※ perror 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

void perror(const char* errmsg);

파라미터

  • const char* errmsg
    • stderr 로 출력할 error message 를 입력한다.

반환값 (return)

없음 (void)

잡학지식

요즘은 errno 가 thread safe 하지만 전역변수를 사용한다는 점은 변하지 않았기 때문에 error 이후 또다른 error 발생시 해당 값들이 덮어씌워진다. 

 

따라서 errno, ferror, perror, strerror 와 같이 전역 errno 를 사용하는 함수는 반드시 error 발생 직후 사용해야한다. 

(아래 예시 코드 참고)


 

<소스 코드 1>

#include <stdio.h>

#define MAX_BUF_SIZE 128

int main() {
    FILE *fp;
    char buffer[MAX_BUF_SIZE] = {0,};
    char *ret;

    fp = fopen("not_exist.txt", "r");
    if (fp != NULL) {
        fclose(fp);
    } else {
        // fopen 함수 실패
        perror("fopen error");
    }

    return 0;
}

 

※ 실행 결과

fopen error: No such file or directory

 

 

<소스 코드 2>

#include <stdio.h>

#define MAX_BUF_SIZE 128

int main() {
    FILE *fp;
    char buffer[MAX_BUF_SIZE] = {0,};
    char *ret;

    fp = fopen("not_exist.txt", "r");
    if (fp != NULL) {
        fclose(fp);
    } else {
        // fopen 함수 실패 직후 fgets 실패로 errno 덮어써짐
        ret = fgets(buffer, MAX_BUF_SIZE, NULL);
        if (ret == NULL) {
            perror("fgets error");
        }
    }

    return 0;
}

 

※ 실행 결과

fgets error: Invalid argument
반응형