select 함수의 대한 의문점..

wnldirqhrdyd의 이미지

안녕하세요
갓 IT업계에 뛰어든 초보 개발자입니다.

하나 의문점이 드는데요

select 함수에서..

//=======================================================================================
int select ( int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout )
n : 검사 대상이 되는 파일 디스크립터의 수
readfds : "입력 스트림에 변화가 발생했는지" 확인하고자 하는 소켓들의 정보를 전달한다. 여기서 입력 스트림에 변화가 발생했다는 것은 수신할 데이터가 있다는 뜻이다.
writefds : "데이터 전송 시, 블로킹되지 않고 바로 전송이 가능한지" 확인하고자 하는 소켓들의 정보를 전달한다.
exceptfds : "예외가 발생했는지" 확인하고자 하는 소켓들의 정보를 전달한다.
timeout : 함수 호출 후, 무한 대기 상태에 빠지지 않도록 타임-아웃을 설정하기위해 인자를 전달한다
//=======================================================================================

마지막 인자인 timeout에..

timeout.tv_sec = 0;
timeout.tv_usec = 0;

이것과..

NULL 을 넣는것과의 차이점이 무엇인가요..?

select를 사용하여 서버를 구현하고 있습니다.
클라이언트가 접속하면 shared memory에서 데이터를 읽어 클라이언트에게 브로드캐스팅하는 구조입니다.
그런데..
timeout의 시간을 0초로 설정하면 잘되는데
NULL로 설정하면 블럭이 걸립니다.

이상한데요.. 이유가 무엇일까요..? ;;

sohn9086의 이미지

man page에서

Quote:

timeout is an upper bound on the amount of time elapsed before select returns. It may be zero, causing select to return immediately. (This is useful for polling.) If timeout is NULL (no timeout), select can block indefinitely.

즉, timeout값이 0일 경우에는 폴링에 해당되며, timeout이 NULL일 경우에는 타임아웃의 상한선이 없다는 의미로 해석되어 I/O가 발생하지 않으면 블록됩니다.
--------------
save the earth

생산적인 댓글을 달자