select함수

asleea의 이미지

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/time.h>
int main()
{
        struct timeval a;
        a.tv_sec = 10; 
        a.tv_usec = 0;
 
        fd_set  set;
        FD_ZERO(&set);
        FD_SET(STDIN_FILENO, &set);
        while(1)
        {   
 
                select(STDIN_FILENO + 1, &set, NULL, NULL, &a);
 
                fprintf(stderr, "sec : %ld, usec : %ld\n", a.tv_sec, a.tv_usec) ;
        }   
        return 0;
}

select return시에 timeout 시간이 어떻게 변하는지 눈으로 확인하고자 간단한 코드를 작성하였습니다.

제 생각에는 select에 블록이 되어있을 때 제가 입력을 주면 select가 return되고 timeout에서 남은 시간을 화면에 출력하고

fd_set에는 준비되 파일 디스크립터가 남아 있기 때문에 그대로 STDIN_FILENO이 들어있을테고 다시 select에서 블록이 될 것이라고

생각을 하였는데(다시 입력을 주면 출력을 하고 다시 select에 블록이되는 것을 반복하도록)

첫 loop에서만 블록이되고 입력을 주어 select가 return된 후에는, (2번째 seleoct부터)블록이 되지 않고 계속해서 tiemout시간을 출력합니다.

예를 들면

(select block)
(입력)
sec : 9, usec : 56
sec : 9, usec : 55
sec : 9, usec : 54
sec : 9, usec : 53
sec : 9, usec : 51
sec : 9, usec : 43
sec : 9, usec : 42
sec : 9, usec : 41
sec : 9, usec : 38
sec : 9, usec : 37
sec : 9, usec : 36
sec : 9, usec : 35
sec : 9, usec : 33
.
.
.
.
.
sec : 9, usec : 10

제가 먼가 잘못 알고 있는 건가요 ?왜그런지