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 함
// 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()가 에러를 리턴하는 경우는 아래의 네가지 이다.
- EBADF - invalid fd
- EINTR - signal 받음
- EINVAL - n이 음수거나 timeout값 설정이 이상함
- ENOMEM - out of memory
No comments:
Post a Comment