Select 함수
앞의 포스팅에서 설명한 멀티플렉싱 기법을 구현하는데 가장 많이 사용되는 방법이 바로 Select함수를 이용하는 것이다. 또한 리눅스 뿐만 아니라 윈도우에도 같은 이름으로 동일한 기능을 제공하는 함수가 있기 때문에 이식성에도 좋다.
#include<sys/select.h>
#include<sys/time.h>
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptest, const struct timeval *timeout);
->성공시 0이상 실패시 -1 반환.
maxfd -> 검사 대상이 되는 파일 디스크립터의 수.
readset -> fd_set형 변수에 수신된 데이터의 존재여부에 관심 있는 파일 디스크립터 정보를 모두
등록해서 변수의 주소값 전달.
writeset -> fd_set형 변수에 블로킹 없는 데이터 전송의 가능여부에 관심 있는 파일 디스크립터 정보를
모두 등록해서 그 변수의 주소 값을 전달한다.
exceptset -> fd_set형 변수에 예외상황의 발생여부에 관심이 있는 파일 디스크립터 정보를 모두
등록해서 그 변수의 주소 값 전달.
Select 함수의 기능
Select 함수를 이용하면 한곳에 여러개의 파일 디스크립터를 모아놓고 동시에 관찰할 수 있다.
1. 수신한 데이터를 지니고 있는 소켓이 존재하는지.
2. 불로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인지.
3.예외상황이 발생한 소켓은 무엇인지.
를 관찰할수가 있다.
Select 함수 호출순서
Select 함수를 호출하기 전에는 파일디스크립터,검사 범위, 타임아웃의 설정을 해줘야 비로소 Select함수를 호출할 수가 있다.
파일디스크립터 설정
Select 함수를 이용하여 여러개의 파일디스크립터를 관리할 수 있는데, 여러개의 파일디스크립터를 모을 떄도 목적에 따라서 구분해서 모아야 하고, 파일 디스크립터를 모을 때 사용하는 것이 fd_set형 변수이다. fd_set형은 0과 1로 표현되는, 비트단위로 이뤄진 배열이다.
<fd_set 자료형>
fd_set형 변수를 조작하기 위해서는 매크로 함수를 이용하면 된다.
FD_ZERO(fd_set *fdset)
//인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화.
FD_SET(int fd, fd_set *fdset)
//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보 저장.
FD_CLR(int fd,fd_set *fdset)
//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보 삭제.
FD_ISSET(int fd,fd_set *fdset)
//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보가 있으면 양수반환.