CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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 -
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.