errno역사적 이유로 1 C 라이브러리는 0으로 설정되지 않습니다 . POSIX는 더 이상 성공할 경우 라이브러리가 값을 변경하지 않을 것이라고 주장하지 않으며 새로운 Linux 매뉴얼 페이지에errno.h 다음 사항이 반영됩니다.
<errno.h>헤더 파일은 정수 변수 정의 errno시스템 호출과 무엇이 잘못되었는지 나타내는 오류의 경우 일부 라이브러리 함수에 의해 설정된다. 이 값은 호출의 리턴 값이 오류를 표시 한 경우 (예 : -1대부분의 시스템 호출 -1또는 NULL대부분의 라이브러리 함수) 에만 중요합니다 . 성공한 함수 는 변경할 수 있습니다 errno.
ANSI C 이론적 근거는 위원회가 채택 및 사용하는 기존의 관행을 표준화하는 것이 현실적하다고 생각한다고 errno.
설정에 중점을 둔 오류보고 기계 errno는 일반적으로 최대 허용 오차로 간주됩니다. 라이브러리 기능 사이에``병리학 적 커플 링 ''이 필요하고 정적 쓰기 가능 메모리 셀을 사용하여 공유 가능 라이브러리의 구성을 방해합니다. 그럼에도 불구하고,위원회는보다 야심 찬 무언가를 발명하기보다는 기존의 결함이있는 기계를 표준화하는 것을 선호했다.
설정되어 있는지 확인하는 것 이외의 오류를 확인하는 방법은 거의 항상 있습니다 errno. errno일부 호출은 오류 이유를 얻기 위해 별도의 API를 호출해야하므로 설정이 올바른지 확인하는 것이 항상 신뢰할 수있는 것은 아닙니다. 예를 들어, 또는 ferror()에서 짧은 결과를 얻는 경우 오류를 확인하는 데 사용됩니다 .fread()fwrite()
흥미롭게도, 사용의 당신의 예는 strtod()설정 위치를 사례 중 하나입니다 errno통화가되기 전에 0에 필요한 오류가 발생했는지 정확하게 감지 할 수 있습니다. strto*()오류가 발생하더라도 유효한 리턴 값이 리턴되므로 모든 문자열 대 숫자 함수에는이 요구 사항이 있습니다.
errno = 0;
char *endptr;
double x = strtod(str1, &endptr);
if (endptr == str1) {
/*...parse error */
} else if (errno == ERANGE) {
if (x == 0) {
/*...underflow */
} else if (x == HUGE_VAL) {
/*...positive overflow */
} else if (x == -HUGE_VAL) {
/*...negative overflow */
} else {
/*...unknown range error? */
}
}
위의 코드는 strtod()Linux에 문서화 된 동작을 기반으로합니다 . C 표준은 언더 플로우가 작은 양의보다 큰 값을 반환 할 수 있도록 규정 double하고 있는지의 여부가 errno설정되었습니다 ERANGE구현이 정의 2 .
실제로 라이브러리 호출 전에 항상 0으로 설정 하고 호출이 실패를 표시 한 후 해당 값 을 확인하도록 권장 하는 광범위한 인증서 권고 작성 이 있습니다. 일부 라이브러리 호출을 설정하기 때문입니다 호출 자체가 성공하더라도 3 .errnoerrno
errno프로그램 시작시 값 은 0이지만 라이브러리 함수에 의해 0으로 설정되지 않습니다. C 표준의 함수 설명에 errno사용이 errno문서화되어 있지 않은 경우 오류가 있는지 여부에 관계없이 라이브러리 함수 호출에 의해 값이 0이 아닌 값 으로 설정 될 수 있습니다 . 프로그램이 errno오류가보고 된 후에 만 내용을 검사하는 것이 의미 가 있습니다. 보다 정확하게 errno는 errno오류 를 설정하는 라이브러리 함수가 오류 코드를 반환 한 후에 만 의미 가 있습니다.
1. 이전에는 이전 호출의 오류를 가리는 것을 피한다고 주장했습니다. 이 주장을 뒷받침 할 증거를 찾을 수 없습니다. 나는 또한 가짜 printf()예를 가지고있었습니다 .
2. 이것을 지적 해준 @chux에게 감사합니다. 참조는 C.11 §7.22.1.3 ¶10이다.
3. 댓글에서 @KeithThompson이 지적했습니다.
errno언제든지 제로로 설정할 수 있습니다.