strerror(3)

#include <string.h>

char *strerror(int errnum);

시스템 오류 번호에 대한 오류 메세지를 문자열로 반환하는 함수입니다. 주로 시스템 콜 함수들이나 내부적으로 시스템 콜 함수를 사용하는 함수들에서 설정한 errno 전역변수의 오류번호를 문자열로 변환합니다.

 

errno 전역변수는 errno.h에 포함되어 있습니다.

 

※정보: errno 전역변수는 전역변수처럼 보이기 때문에 Multi-thread에 안전하지 않은 것 같지만, thread 마다 다르게 관리되므로 Multi-thread에 안전합니다.

 

※주의strerror(3)함수는 Multi-thread unsafe한 함수이므로 Multi-thread 프로그램에서는 strerror_r(3)을 이용합니다.

strerror(3)함수의 소스를 확인 못하였지만, 이 함수가 Multi-thread unsafe한 이유가 뭘까? 생각해보았습니다. 

내가 만약 구현했다면 문자열 배열로 가지고 있다가 errnum번째 상수를 return했을 것 같은데...... 라고 생각한 순간 ......

return값 중에서 상수로만 안되는 것이 있네요. 잘못된 errnum(예. 150)을 넘겼을 때에 "Unknown error 150".오류 메세지는 static 변수로 처리해야 하겠군요. 

따라서,  표준 함수들에서 오류가 발생하여 errno에 설정된 오류 번호만 사용한다면, multi-thread에서도 문제가 없을 듯 합니다. 
(strerror_r(3)의 사용은 너무 귀찮네요. ;;;)

 

 

파라미터

 errnum 
     - 오류 메시지 문자열을 얻고 싶은 오류번호

 

RETURN

오류 메시지
    - 오류번호와 일치하는 오류 메세지 문자열
    - 만약 오류번호를 잘못 입력하면, 
      시스템에 따라서 NULL  또는 "Unknown error nnn"를 return 합니다. 

 


활용 예제

 

#include <errno.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    FILE *fp;

    if((fp = fopen(argv[1], "r")) == NULL) {
        fprintf(stderr, "errno[%d] : %s\n", errno, strerror(errno));
        return 1;
    }

    ......

    return 0;
}
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요