2012-12-27 3 views
3

과 같이 정의 (내 시스템에 소스)이해 C의 errno를 내 시스템 <code>errno</code>에

  1. 내가 사방 검색

    하지만 __error() 함수의 정의를 찾을 수 없으므로 누군가가 그 정의를 표시하거나 설명 할 수 있습니까?

  2. errno = 0이 위의 정의와 어떻게 작동합니까? (함수에 0 할당?)? errno = 0* __error() = 0으로 확장됩니까?

감사

+0

"내 시스템"이 무엇인지 말씀해 주시겠습니까? –

답변

7

__error 함수는 호출 한 쓰레드의 errno 변수에 대한 포인터를 반환합니다. errno 매크로는 해당 포인터를 역 참조하여 등호의 양쪽에 나타날 수있는 lvalue가됩니다.

귀하의 질문에 대답하려면 :

  1. 기능은 특정 스레드에 대한 errno 변수에 대한 올바른 주소를 결정합니다. 각 스레드는 자체적으로 가져옵니다.

  2. 예, 해당 스레드의 errno 변수에 0을 할당하는 것은 (* __error()) = 0;이됩니다.

+2

답변을 주셔서 감사합니다. 즉, 내 OS 함수 '__error()'의 어딘가에'int * __error() {return &errno;} '이라는 정의가 있음을 의미합니다. 맞습니까? 그리고'errno'는 .c 파일에서'static int errno'입니까 ?? – Orion

+3

@ManiH : 아마도 좀 더 복잡 할 것이다. 반환 된'errno'는 전역 적이 지 않지만 일종의 스레드 로컬 저장소 (즉, 각 스레드에 대해'errno' 인스턴스가 있습니다. '__error()'구현은 현재 스레드를 기준으로 인스턴스에 대한 포인터를 검색합니다. –