library/CRT

errno

란마12 2011. 1. 8. 22:49

표준 C에서는 errno를 통해서 실패의 이유를 알 수 있다.

다음은 예제는 C에서의 에러 처리 기법이다.
int main()
{
        FILE* f = fopen("a.txt", "rt");

        if ( f == 0 )
        {
            printf("error : %d\n", errno);
            printf("%s\n", strerror(errno ));        // errno를 문자열로 바꿔준다.
            perror("FAIL");                                // fprintf( stderr, "FAIL : %s\n", strerror(errno)) 의미
        }
}
여기서 문제는 error가 전역변수 라는 것이다. 지금은 문제가 안되겠지만, 멀티스레드 환경에서는 이 변수를 공유하기 때문에
문제가 될 수 있다.
그래서 윈도우즈 환경에서는 에러정보를 스레드당 한개씩 갖고 있게된다.

윈도우즈 환경에서는 스레드를 만들때마다 구조체가 한개씩 생성된다. 이 구조체를 TEB(Thread Environment Block)라 한다.
즉, 스레드가 10개 생성되면 TEB도 10개가 생성되는 것이다.

이 TEB안에는 모든 스레드별로 다양한 정보가 있는데, 그중에 Last Error Value 정보가 있다. 이Last Error Value가 C에서의 errno역할을 한다. 스레드당 한개씩 생기기 때문에 멀티스레드 환경에서 안전하다고 할 수 있다.

이 때, Last Error Value값을 꺼내오는 함수가 바로 GetLastError()이다.

또, TEB의 전체 내용은 User Memory에 있기 때문에 우리가 접근할 수 있고, WinDBG를 사용하면 TEB의 내용도 확일할 수 있다.

ex) dt nt!_TEB

http://sungjinl2e.egloos.com/3325928