thread별로 유지되는 errno 구현방법이 알고 싶습니다.
글쓴이: xjiwoox / 작성시간: 토, 2003/06/07 - 8:03오후
일반적으로 전역변수 errno를 참조할 때 _REENTRANT가 define되어있지 않으면 process 내의 모든 thread가 같은 errno 변수를, _REENTRANT가 define되어 있으면 각 thread가 서로 다른 errno를 참조하게 되는데요.
시스템 함수에서 에러 발생시 어떻게 thread별로 errno를 셋팅하는지, 또 각 thread는 어떻게 자신의 errno를 구분해서 참조하는지 알고 싶습니다.
Forums:
Key를 사용하면, thread 별로 static한 변수를 사용할 수 있
Key를 사용하면, thread 별로 static한 변수를 사용할 수 있습니다만
error number를 그렇게 셋팅해서 쓰는지는 잘 모르겠습니다.
앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;
Key를 사용한다는게 무슨 뜻인지 잘 모르겠습니다 ^^좀 더 구체적으
Key를 사용한다는게 무슨 뜻인지 잘 모르겠습니다 ^^
좀 더 구체적으로 설명해 주시면 안 될까요.
부탁드립니다.
s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a
쓰레드 특정 데이터 (Thread specific data) 메커니즘을
쓰레드 특정 데이터 (Thread specific data) 메커니즘을 사용하여 쓰레드 별 errno 를 구현할 수 있다는 의도로 보입니다.
물론 충분히 가능한 방법이라고 생각합니다만, 그것까지는 모르겠고 차이점만을 말씀드리자면,
_REENTRANT 가 없으면 errno는
extern in errno;
즉, 전역 변수를 공유해 사용합니다. 이에 비해 _REENTRANT가 정의되어 있으면
define errno (*__errno_location ())
와 같이 errno 를 __errno_location() 함수 호출로 치환합니다.
__errno_location() 함수는 적절한 방법을 써서 각 쓰레드별로 각각 다른
errno 값을 가지고 있겠지요.. 이 방법 중에 하나가 쓰레드 특정 데이터가
될 수 있을 것입니다.
한 가지 주의를 덧붙이자면, 쓰레드 프로그래밍을 하실 때는
int errno;
와 같이 이전에 하시던 대로 errno 변수를 정의하시면 안 됩니다.
위에서 errno는 전처리기에 의해 치환되어 버리겠지요 ^^
shkwon81 님께서 아주 잘 설명해 주셨습니다.첨언하자면, e
shkwon81 님께서 아주 잘 설명해 주셨습니다.
첨언하자면, errno 는 여러가지 현실적인 문제 (예를 들면, 현재 논의 중인
shared library 와 관련된 문제나 floating-point arithmetic 에서 pipelining
을 망치는 문제 등) 로 인해 errno 자체가 반드시 object 로 선언될 필요는
없습니다. 다만, 수정가능한 lvalue 이기만 하면 됩니다. 따라서, 위에서
보여주신 매크로를 사용한 예가 충분히 가능합니다.
또한, 표준은 implementer 에게 예약되는 명칭에 errno 를 다양한 문맥에서
포함해 줌으로써 사용자의 프로그램 내에서 임의로 선언하거나 (실제 존재할지
안 할지 알 수 없는) errno 라는 대상체에 어떻게든 접근하려는 행동을 철저히
금지하고 있습니다.
errno 외에도 C 언어의 표준 라이브러리에는 <time.h>, <locale.h> 등과 관련된
static object, <ctype.h> 과 관련된 shared table, rand() 와 관련된 random
seed 등이 재진입성을 고려해 작성되어야 하는 함수 들입니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기