errno
표준 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