Select 함수

#include <sys/select.h>

#include <sys/time.h>

int select(int maxfd, fd_set *readset, fd_set*writeset, fd_set *exceptset, const struct timeval *timeout);

maxfd : 검사 대상이 되는 파일 디스크립터의 수

readset : fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록 해서 그 변수의 주소 값을 전달한다.

writeset : fd_set형 변수에 '블로킹 없는 데이터 전송 가능여부'에 관심 있는파일 디스크립터 정보를 모두 등록 해서 그 변수의 주소 값을 전달한다.

exceptset : fd_set형 변수에 '예외상황의 발생여부'에 관심 있는파일 디스크립터 정보를 모두 등록 해서 그 변수의 주소 값을 전달​

timeout : select함수 호출 이후에 무한정 블로킹 상태에 빠지지 않도록 타임아웃(time-out)을 설정하기 위한 인자를 전달한다.

반환값 : 오류발생시 -1, 타임 아웃에 의한 반환 0, 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰값이 반환 되는데, 이값은 변화가 발생한 파일 디스크립터의 수를 나타냄.​

 

Select 함수의 호출 순서

Step One

파일 디스크립터의 설정

검사의 범위 지정

타임아웃의 설정

Step Two

select 함수의 호출

Step Three

호출결과 확인

 

  • 파일 디스크립터의 설정
    1. FD_ZERO(fd_set *fdset) : 인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화 한다.
    2. FD_SET(int fd, fd_set *fdset) : 매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보를 등록 한다.
    3. FD_CLR(int fd, fd_set *fdset) : 매개변수 fdset으로 전달된 주소의 변수에서 매개변수 fd로 전달된 파일 디스크립터 정보를 삭제한다.
    4. FD_ISSET(int fd, fd_set *fdset) : 매개 변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보가 있으면 양수를 반환한다 ( select 함수의 호출결과를 확인하는 용도로 사용)

 

  • Select 함수 호출 이후의 결과 확인



#include <unistd.h>
#include <sys/time.h>
#include <sys/select.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
fd_set reads, temps; //fd_set type reads,temps 선언
int result, str_len;
char buf[BUF_SIZE];
struct timeval timeout; //timeval type timeout 선언

FD_ZERO(&reads); //reads valriable ZERO set
FD_SET(0, &reads); //0 is strandard input(console)

/*
timeout.tv_sec=5;
timeout.tv_usec=5000;
*/

while(1){
temps=reads; //temp변수에 reads변수 대입
timeout.tv_sec=5;
timeout.tv_usec=0;
result=select(1, &temps, 0, 0, &timeout); //select() 호출 반환값 result
if(result==-1){ //실패 할 경우 error 출력
puts("select() error");
break;
}
else if(result==0){ //타임 아웃
puts("Time-out!");
}
else{ //정상으로 동작할 경우
if(FD_ISSET(0, &temps)){ //동작확
str_len=read(0, buf, BUF_SIZE); //standard input을 통해 input
buf[str_len]=0; //NULL문자 삽입
printf("message from sonsole : %s", buf); //출력
}
}
}
return 0;
}

반응형

'Programming' 카테고리의 다른 글

애니메이션 버튼  (0) 2014.09.15
파일업로드  (0) 2014.09.15
select() 기반 echo_server  (0) 2014.09.15
Thread  (0) 2014.09.15
Pcap library  (0) 2014.09.15