'에러'에 해당되는 글 2건

  1. 2009.10.02 strerror()
  2. 2009.10.02 perror()

strerror() : 시스템 에러 메시지를 반환.

용도:
#include <string.h>

char *strerror(int errnum);

파라메터:
errnum: 에러 메시지 번호

반환 값:
에러가 있다면 에러메시지를 반환하고 없으면 return 하지 않음.

strerror()는 에러 번호가 가리키는 에러 메시지 문자열의 주소를 반환한다. strerror()는 어떤 종류의 에러가 있는지 확인하기 위한 용도로도 사용할 수 있지만, 대부분은 발생한 에러를 확인하기 위해 사용된다. 따라서 전역 변수인 errno와 함께 사용된다. 또한 strerror()는 에러 메시지가 위치한 주소를 알려줄 뿐이므로 별도의 출력 함수와 함께 사용하게 된다.

ex) printf("error: %s\n", strerror(errno));
이것은 다음의 코드와 같다.

ex) perror("error");

errno 전역 변수는 에러가 발생할 때마다 운영체제가 기록하는 전역 변수이다. 스레드 안전(thread-safe) 유무에 따라 전역 변수이기도 하고 함수를 호출한 결과에 * 연산자를 붙여서 사용하기도 한다. 여기서는 편의상 전역 변수라고 부른다.

errno 전역 변수는 프로그램이 시작할 때 "에러가 발생하지 않았다"는 뜻의 0으로 시작해서, 에러가 발생할 때마다 새로운 에러 번호로 갱신된다. 매번 에러가 발생할 때마다 갱신되기 때문에 strerror()를 사용하는 올바른 방법은 에러가 발생하자마자 결과를 확인하는 것이다. 결과를 나중에 확인하면 이후에 발생한 에러로 인해 우리가 원하는 에러가 아닌, 이후에 발생한 에러메시지가 나올 수 있다.
errno 전역 변수는 매번 갱신되는 것이 아니라 에러가 발생할 때마다 갱신된다. 에러가 발생한 이후에 errno 전역 변수를 초기화하고 싶다면, 아래 코드처럼 직접 0을 넣어주면 된다.
ex) errno = 0;

strerror()가 반환한 포인터는 운영체제에서 사용하는 공간이기 때문에 해제하려는 시도는 치명적인 결과를 가져올 수 있다.
또한 반환한 포인터를 이용해서 에러 메시지 문자열을 변경하려고 해서도 안된다.

이름  설명  반환값  매개 변수  errno
 strerror  에러 메시지 반환  char*  에러 번호  매개 변수로 전달해서 사용
 perror  에러 메시지 출력  void  출력 메시지 앞에 놓일 문자열  내부에서 무조건 사용


ex)
#include <stdio.h>
#include <string.h>

void main()
{
    const char* errors[] =
    {
        "******",
        "EPERM", "ENOENT", "ESRCH", "EINTR", "EIO", "ENXIO", "E2BIG", "ENOEXEC", "EBADF", "ECHILD",
        "EAGAIN", "ENOMEM", "EACCES", "EFAULT", "******", "EBUSY", "EEXIST", "EXDEV", "ENODEV", "ENOTDIR",
        "EISDIR", "EINVAL", "ENFILE", "EMFILE", "ENOTTY", "******", "EFBIG", "ENOSPC", "ESPIPE", "EROFS",
        "EMLINK", "EPIPE", "EDOM", "ERANGE", "******", "EDEADLK", "******", "ENAMETOOLONG", "ENOLCK", "ENOSYS",
        "ENOTEMPTY", "EILSEQ", "******"
    };

    int i;
    printf( "--------------------------------------------------\n" );
    printf( "no name         description\n" );
    printf( "--------------------------------------------------\n" );

    for( i = 0; i <= 43; i++ )
        printf( "%2d %-12s %s\n", i, errors[i], strerror(i) );

    printf( "--------------------------------------------------\n" );
}

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz
perror() 시스템 에러 메시지를 출력한다.

용도:
#include <stdio.h>

void perror(const char *str);

파라메터:
str: 에러 메시지와 함께 출력할 문자열.

반환 값: 없음.

'Programming > General Topics' 카테고리의 다른 글

C의 메모리 관리 구조  (0) 2010.06.12
exec() family  (0) 2009.10.02
strerror()  (0) 2009.10.02
perror()  (0) 2009.10.02
Programming Problems 2.22  (0) 2009.10.02
저수준 파일 입출력 함수  (0) 2009.10.02
Posted by exahz
TAG perror, 에러

티스토리 툴바