| [ CnUnix ] in KIDS 글 쓴 이(By): terzeron (microkid) 날 짜 (Date): 2002년 12월 10일 화요일 오전 01시 09분 56초 제 목(Title): Re: select()함수 설명 부탁드려요... 소스에 별 문제가 없는 것 같습니다. (errset과 errfd의 혼용이나 * 연산자가 잘못 붙은 것 빼고는요) 시스템마다 timeout에 대한 동작이 다른지 제가 테스트한 환경에서는 timeout이 매번 제대로 설정되는군요. (그냥 두면 15초 타이머로 동작합니다.) 다음은 위 소스를 기반으로 하여 재구성한 코드입니다. 소켓대신 표준입력으로부터 데이터를 받습니다. 그리고 5초의 타임아웃이 설정되어 있습니다. 첫번째 타임아웃이 발생해도 한 문장의 입력을 새로 주면 read가 수행되고 빠져나옵니다. #include <stdio.h> #include <sys/types.h> #include <sys/time.h> #include <unistd.h> #include <strings.h> int main() { int time = 0; fd_set recfd; fd_set errfd; int s = 0; char buf[1024]; struct timeval tval = {5, 0}; while (1) { time++; if (time > 3) { break; } FD_SET(s, &recfd); FD_SET(s, &errfd); select(s+1, &recfd, NULL, &errfd, &tval); if (FD_ISSET(s, &recfd)) { printf("read\n"); read(s, buf, 1024); break; } else if (FD_ISSET(s, &errfd)) { printf("error\n"); break; } else { // timeout printf("timeout\n"); FD_ZERO(&recfd); FD_ZERO(&errfd); continue; } } return 0; } --- 어떤 성취가, 어떤 조롱이, 또는 어떤 고뇌가 나를 기다리고 있을지 나는 모른다. 나는 아무 것도 모른다. 그러나 나는 아직 과거의 경이로운 기적의 시대가 영원히 과거의 것이 되어 버리지는 않았다는 사실을 굳게 믿고 있다. - Stanislaw Lem - |