2012-07-28 3 views
19

나는이 두 가지 방법으로 두 통화 :errno 값을 설정하는 방법은 무엇입니까?

void func1() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to EEXIST 

    } 

} 

그리고 두 번째 방법 : 나는 어떤 값으로 errno을 설정하면

void func2() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to ENOENT 

    } 

} 
  1. , 그것은 무엇을합니까? 그냥 오류 검사?

  2. 어떻게 그것은 일반적으로 비록 당신이 (전역 변수처럼 errno을 치료할 수 위의 방법 func1errnofunc2EEXISTENOENT

감사

모든 실제적인 목적을 위해

답변

42

을 설정할 수 있습니다 아니). 그래서 errno.h을 포함하고 그냥 사용 errno이 당신의 목적에 가장 적합한 오류보고 메커니즘 경우

errno = ENOENT; 

당신은 자신을 요청해야합니다. 오류 코드를 직접 반환하도록 함수를 조작 할 수 있습니까?

+11

일반적으로 시스템 오류 *를보고 할 때는'errno'가 사용됩니다. 라이브러리 또는 코드가 시스템의 일부라고 생각하십니까? 그렇지 않은 경우 다른 메커니즘을 사용하여 오류를보고하십시오. –

+3

필연적으로, strtol()과 같은 유틸리티 함수는 ERANGE를 반환하는 것처럼 보입니다. 예를 들어, 실제로는 _ 시스템 오류가 아닙니다. – proteus

+1

errno를 설정하는 것이 적절한 장소의 예는 funopen()에 전달 된 읽기 또는 쓰기 함수 콜백에 있습니다. 이 경우 구현은 시스템 호출 (read() 또는 write())과 일치해야하므로 오류가 발생하면 -1을 반환하고 특정 오류로 errno를 설정하는 것이 좋습니다. – orpheist

3
#include <errno.h> 
void func1() 
{ 
    // do something 
    if (fail) 
    { 
    errno = ENOENT; 
    } 
} 
5

IMO, 시스템 레벨 용으로 설계된 errno입니다. 나의 경험은 그들을 오염시키지 않는다.

/* your_errno.c */ 
__thread int g_your_error_code; 

/* your_errno.h */ 
extern __thread int g_your_error_code 
#define set_your_errno(err) (g_your_error_code = (err)) 
#define your_errno (g_your_error_code) 

을하고도 여전히 your_perror(err_code)을 구현할 수 있습니다 : 당신은 C 표준 errno 메커니즘을 시뮬레이션하려면, 당신은 몇 가지 정의처럼 할 수 있습니다. 자세한 내용은 glibc의 구현을 참조하십시오.

관련 문제