Wednesday, March 5, 2008

select()

select() 함수는 아래 처럼 사용되는데, 인자를 순서대로 설명하면, 등록하는 여러개의 fd들의 값중 제일 큰 값 + 1 이 첫번째 인자인데, select()가 fd의 처음부터(0아니면 1,..) 이값 n 사이의 fd를 check하도록 되어 있기 때문이다. 두번째 인자 부터는, 읽을 수 있는 fd 집합, 쓸 수 있는 fd 집합, 특정 exception이 일어나는 fd집합 그리고 timeout 값이다.


int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct time_val *timeout);

// Helper macros
FD_ISSET(int fd, fd_set *set); // fd가 set되 있는지
FD_SET(int fd, fd_set *set); // fd를 set시킴
FD_CLR(int fd, fd_set *set); // fd를 unset 시킴
FD_ZERO(fd_set *set); // 모든 fd를 unset 함


그래서 select()는 등록된 fd 중 조건에 만족하는 fd들중 제일 큰 값을 리턴하고, timeout에 걸린 경우 0을 리턴한다. 위 처럼 같이 제공되는 매크로를 사용하면 편리하다(제대로 코드를 짰다면 FD_CLR은 사용할 일이 없어야 한다). select()가 리턴되었을때 사용가능한 fd들을 사용하고 나서 다시 호출전에 timeout값을 다시 설정 해줘야한다. (리눅스에서는 리턴될때 timeout 값을 'timeout - elapsed time' 으로 설정해서 리턴해준다. 리눅스에서 동시에 사용할 수 있는 파일 수는 FD_SETSIZE 값과 같이 1,024개임도 유념하자. select()가 에러를 리턴하는 경우는 아래의 네가지 이다.
  1. EBADF - invalid fd
  2. EINTR - signal 받음
  3. EINVAL - n이 음수거나 timeout값 설정이 이상함
  4. ENOMEM - out of memory

No comments:

Post a Comment