select와 alarm 을 이용한 thread 에서 select error
글쓴이: kyeongchan / 작성시간: 월, 2004/11/08 - 10:07오전
메인쓰레드에서 주기적으로(10초) 간격으로 알람을 발생시킵니다.
그리고 다른 쓰레드에서
select 로 2초의 타임아웃값을 가지고 데이타가 있는지 검사합니다.
그런데 5번에 1번꼴로 select에서 (-1) 의 값을 반환을 합니다만,
errno 는 0 으로 셋팅이 되어있네요... select가 실패하는 원인을 찾기가 난감합니다... 어떤경우가 있을까요...
알람과 관계가 있는듯합니다만...
struct timeval tv = {2,0}
state = select(fd+1, &sRset, NULL, NULL, &tv);
switch(state) {
case -1 :
fprintf(stderr, "errno : %d, errstr : %s", errno, strerror(errno));
break;
...................
}
추가:
알람이 발생하여 해당하는 코드가 실행되고 난 후 항상 select error 가 발생합니다. errno: 0 으로 찍히구요...
Forums:
Solaris 에서는 컴파일 옵션에.. _REENTRANT 를 정의하니.
Solaris 에서는 컴파일 옵션에.. _REENTRANT 를 정의하니.. thread상에서
errno값이 제대로 나온던군요..
구글에서 thread, errno 로 검색해보세요
도움 되셨길..
[quote="faye"]Solaris 에서는 컴파일 옵션에.. _REE
정확한 답이 되었습니다...^^
이것은 정말 중요한 경험입니다. ^^;전통적인 전역객체인 errn
이것은 정말 중요한 경험입니다. ^^;
전통적인 전역객체인 errno 변수를 재진입가능한 쓰레드 프로그래밍에서도 처리가능하게하는 것은 고민되는 것중의 하나죠.
라이브러리도, _REENTRANT를 넣고 컴파일하지 않은 것과 넣은 것끼리는 절대 같이 쓸 수가 없습니다.
부분 컴파일하여 작업할 때는 항상 고민되는 부분입니다. 이런 설계 때문에, errno를 직접 pass하는 것은 지양해야하며, 항상 errcode나 errstring을 핸들링할 수 있는 방법을 라이브러리는 제공해야합니다.
---
http://coolengineer.com
댓글 달기