programing

왜 음의 오류를 반환합니까?(예: 반환 -EIO)

closeapi 2023. 10. 18. 22:07
반응형

왜 음의 오류를 반환합니까?(예: 반환 -EIO)

또 다른 간단한 예는 다음과 같습니다.

if (wpa_s->mlme.ssid_len == 0)
    return -EINVAL;

왜 단 하나의 마이너스일까요?성공 시 >0을 반환하고 실패 시 <(=)0>을 반환하는 함수에 대해 수행하는 것이 보통입니까, 아니면 다른 이유가 있습니까?

첫째, 이건 진짜 C가 아닙니다.당신은 어떤 목적으로 C로 작성된 함수를 보고 있습니다.모든 언어에서 동일한 규칙을 사용할 수 있습니다.

옛날 유닉스 시절에는 0은 성공, 양수는 사소한 문제, 음수는 일종의 실패를 의미한다는 통념이 있었습니다.따라서, 일종의 회의도 있었습니다.if (foo() >= 0) { /* success of a sort */ }.

이는 의심할 여지 없이 0이 성공한 유닉스 프로세스 반환 코드와 관련이 있었습니다.

그것이 기본적인 이유입니다.많은 함수가 "좋은" 양의 결과를 많이 가지므로 오류 코드에 대해 음의 값을 남깁니다.

C / POSIX 오류 코드는 "역사적으로 성장한" 코드이기 때문에 너무 많은 운율이나 이유를 여기에 돌리려는 것은 큰 의미가 없습니다.

많은 현대 언어들은 오류 코드에 대한 응답 범위의 일부를 가로챌 필요가 없도록 오류에 대한 예외를 적용합니다.물론 어느 쪽이든 트레이드오프는 있습니다.

당신의 이해는 대체로 옳습니다.명백한 해석이 옳은 것입니다.

그러나 표준 규약은 공식과 약간 다릅니다.

유닉스에서 0 상태로 종료되는 프로그램은 셸과 같은 CLI 수준 유틸리티에 대해 이거나 성공한 것으로 테스트합니다.도서관에서.-1는 일반적으로 오류 반환입니다.

이것은 일반적인 패러다임으로 이어집니다.>= 0좋은 뜻과< 0오류를 의미합니다.이 중 어떤 것도 정해진 것이 없습니다.

그건 그렇고, 이것은 보초 패턴으로 분류될 수도 있고 당신은 그것을 보초 복귀라고 부를 수도 있습니다.실제로는 센티넬 "값"과 에러 코드를 조합한 것으로, 한 곳에 에러 코드를, 다른 곳에 에러 코드를 반환하는 것보다 입력하기가 더 쉽고 스레드 세이프로 만드는 것이 더 쉽습니다.

위키피디아에서는 보초값이 루프를 종료하는 데 사용된다고 보고하지만 함수 반환이 훨씬 더 일반적인 예가 될 것이라고 생각합니다.이런 정의를 정확하게 담당하는 사람은 아무도 없습니다.

최적화 관점에서 음수를 사용하면 유닉스 기반 커널이 두 개가 아닌 한 개의 비교만을 사용하여 오류 코드를 확인할 수 있습니다.

커널의 함수는 포인터 대신 오류 코드를 반환하는 경우가 많습니다.즉, 오류 코드가 유효한 포인터 주소와 겹칠 수 없으므로 기본적으로 서명되지 않은 가장 낮은 값이어야 합니다.(>= 0)아니면 가장 높은 것들.(<= unsigned max).

다음에 대한 포인터 값 확인NULL오류 코드는 매우 일반적인 작업이므로 이를 최적화하는 것이 타당합니다.

일반적으로 하단 값< 0x8000이다NULL상위 값은 오류 코드입니다(remember:-1로 저장됩니다.0xff...ff, 가능한 최대 비부호값).

즉, 하나의 비교를 사용하여 각각의 비교를 확인할 수 있습니다.

NULL한다면x <= 0x8000 ~ 0 ~ 0x8000참)

ERRNO한다면x >= (unsigned long)(-MAX_ERRNO) ~ -1 ~ -MAX_ERRNO참)

리눅스의 err.h 파일에서 이러한 현상이 발생하는 것을 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1848729/why-return-a-negative-errno-e-g-return-eio

반응형