SELECT(2)

명칭
select - 동기적인 입출력의 다중화

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/time.h> <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) FD_SET(fd, &fdset) FD_CLR(fd, &fdset) FD_ISSET(fd, &fdset) FD_ZERO(&fdset)

해설
select() (은)는, readfds, writefds 및 exceptfds 그리고 주소를 건네받은 입출력 기술자 집합을 조사해 그러한 기술자의 몇개인가가 각각, 읽기 준비 완료인지, 기록 준비 완료인지, 또는 보류되고 있는 예외 조건이 있을까를 조사합니다. 검출 가능한 유일한 예외 조건은, 소켓상에 수신한 대역외의 데이터입니다. 최초의 nfds 개의 기술자가 각 집합내에서 체크됩니다. 즉, 기술자 집합중의 0 ~ nfds-1 의 기술자가 조사할 수 있습니다. 귀가시에 select() (은)는 지정의 기술자 집합을, 요구된 조작의 준비가 되어 있는 기술자로 구성되는 부분 집합으로 옮겨놓습니다. select() (은)는, 모든 집합 중(안)에서 준비를 할 수 있던 기술자의 총수를 돌려줍니다.

기술자의 집합은, 정수 배열내의 비트 필드로서 보존됩니다. 이러한 기술자 집합을 조작하기 위해서 다음의 매크로가 준비되어 있습니다. FD_ZERO(&fdset) (은)는 기술자 집합 fdset (을)를 하늘 집합으로 초기화합니다. FD_SET(fd, &fdset) (은)는 특정의 기술자 fd (을)를 fdset 에 포함합니다. FD_CLR(fd, &fdset) 하 fd (을)를 fdset (으)로부터 삭제합니다. FD_ISSET(fd, &fdset) 하 fd 하지만 fdset 의 멤버인 경우는 비 0 의 값을, 그렇지 않은 경우는 0 을 돌려줍니다. 이러한 매크로의 동작은, 기술자의 값이 0 미만인지, 또는 FD_SETSIZE 이상인 경우는 미정도리입니다. FD_SETSIZE (은)는 통상, 적어도, 시스템이 서포트하는 기술자의 최대수에 동일해집니다.

timeout 하지만, 누르포인타가 아닌 경우, 그것은 셀렉션의 완료를 기다리는 최대 인터벌을 지정합니다. 시스템의 활동성이, 이 인터벌을 부정 시간 연장하는 일이 있습니다.

timeout 하지만 누르포인타의 경우, select() (은)는 무기한으로 블록 합니다.

폴링을 위해서(때문에)는, timeout 인수는 눌이 아니고, 값이 0 의 timeval 구조체를 가리키고 있어야 합니다.

readfds, writefds 및 exceptfds 의 어느 것으로 붙어도, 어느 기술자도 흥미가 없는 경우는 누르포인타를 지정할 수 있습니다.

반환값
select() (은)는 기술자 집합에 포함되어 있을 준비를 할 수 있던 기술자의 수를 돌려주어, 에러가 일어났을 경우는 -1 을 돌려줍니다. 시한이 오면(자), select() (은)는 0 을 돌려줍니다. 세치기에 의하는 것도 포함해 select() 하지만 에러로 돌아오는 경우는, 기술자 집합은 변경되지 않습니다.

에러
select() (으)로부터 돌아오는 에러는 다음 일을 나타냅니다.

[EBADF]
    기술자 집합의 어떤 것인가가 무효인 기술자를 지정해 있었습니다.

[EINTR]
    시한이 끊어지기 전 혹은 선택한 이벤트중 한쪽이 일어나기 전에, 시그널이 배송되었습니다.

[EINVAL]
    지정의 시한은 무효입니다. 어떤 것인가가 부인지, 또는 너무 큽니다.

[EINVAL]
    nfds 하지만 무효였습니다.

관련 항목
accept(2), connect(2), getdtablesize(2), gettimeofday(2), read(2), recv(2), send(2), write(2), clocks(7)

주
FD_SETSIZE 의 디폴트의 사이즈는 현시점에서는 1024 입니다. 다수의 오픈 파일을 사용할 가능성이 있는 프로그램으로 select() (을)를 실행하기 위해서, <sys/types.h> (을)를 수중에 넣는 헤더를 포함하기 전에 프로그램으로 FD_SETSIZE (을)를 정의하는 것으로, 이 사이즈를 증가할 수 있습니다.

nfds 하지만 오픈 파일의 수보다 큰 경우, select() 하지만 미사용의 파일 기술자를 조사하는 것은 프로텍션되고 있지 않습니다. 역사적인 이유로, select() (은)는 최초의 256 개의 기술자를 반드시 조사합니다.

버그
susv2 그럼, 시스템이 원래의 timeout 를 적당하게 갱신하는 것을 허락하고 있습니다. 따라서, 타임 아웃의 값이 select() 호출에 의해 변경되지 않으면 상정하는 것은 현명하지는 않습니다.

역사
select() 함수는 4.2BSD 그리고 등장했습니다.