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 .errno
errno
errno
프로그램 시작시 값 은 0이지만 라이브러리 함수에 의해 0으로 설정되지 않습니다. C 표준의 함수 설명에 errno
사용이 errno
문서화되어 있지 않은 경우 오류가 있는지 여부에 관계없이 라이브러리 함수 호출에 의해 값이 0이 아닌 값 으로 설정 될 수 있습니다 . 프로그램이 errno
오류가보고 된 후에 만 내용을 검사하는 것이 의미 가 있습니다. 보다 정확하게 errno
는 errno
오류 를 설정하는 라이브러리 함수가 오류 코드를 반환 한 후에 만 의미 가 있습니다.
1. 이전에는 이전 호출의 오류를 가리는 것을 피한다고 주장했습니다. 이 주장을 뒷받침 할 증거를 찾을 수 없습니다. 나는 또한 가짜 printf()
예를 가지고있었습니다 .
2. 이것을 지적 해준 @chux에게 감사합니다. 참조는 C.11 §7.22.1.3 ¶10이다.
3. 댓글에서 @KeithThompson이 지적했습니다.
errno
언제든지 제로로 설정할 수 있습니다.