POLL(2)

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

프로그램 라이브러리
libc

서식
<sys/types.h> <poll.h> int poll(struct pollfd *fds, unsigned int nfds, int timeout)

해설
poll() (은)는 파일 기술자의 집합을 조사해, 그러한 어느쪽이든으로 입출력의 준비가 되어 있는지 아닌지를 조사합니다. fds 인수는 <poll.h> 그리고 정의된 pollfd 배열을 가리킨다 포인터 (후술)입니다. nfds 인수는 fds 배열의 사이즈를 결정합니다.

    struct pollfd {
        int    fd;       /* 파일 기술자 */
        short  events;   /* 검색하는 이벤트 */
        short  revents;  /* 돌려주어진 이벤트 */
    };

pollfd 구조체의 필드는 다음과 같습니다:

fd  조사하는 파일 기술자. 만약 fd 가 -1 라면 revents (은)는 클리어 되고 (0 으로 설정), pollfd 는 체크되지 않습니다.

events
    조사하는 이벤트 (후술).

revents
    발생한 이벤트 (후술).

events (와)과 revents 안의 비트 마스크에는 다음의 비트가 있습니다.

POLLIN
    고우선 데이터 이외의 데이터는 블록 하지 않고 읽기 할 수 있습니다.

POLLRDNORM
    통상 데이터는 블록 하지 않고 읽기 할 수 있습니다.

POLLRDBAND
    우선 순위가 0 이 아닌 데이터는 블록 하지 않고 읽기 할 수 있습니다.

POLLPRI
    고우선 데이터는 블록 하지 않고 읽기 할 수 있습니다.

POLLOUT

POLLWRNORM
    통상 데이터는 블록 하지 않고 기록 할 수 있습니다.

POLLWRBAND
    우선 순위가 0 이 아닌 데이터는 블록 하지 않고 기록 할 수 있습니다.

POLLERR
    디바이스 또는 소켓상에 예외 상태가 일어났습니다. 이 플래그는, events 비트 마스크에 존재하고 있지 않아도 반드시 체크됩니다.

POLLHUP
    디바이스 또는 소켓이 절단 되고 있습니다. 이 플래그는, events 비트 마스크내에 존재하지 않아도 반드시 체크됩니다. POLLHUP (와)과 POLLOUT (은)는, revents 비트 마스크내에 동시에 존재한다 일이 결코 없는 것에 주의해 주세요.

POLLNVAL
    파일 기술자가 오픈되고 있지 않습니다. 이 플래그는, events 비트 마스크내에 존재하는거야 구라고도 반드시 체크됩니다.

timeout 하지만 0 도 INFTIM (-1)도 아닌 경우, 이 값은 몇개의 파일 기술자가 준비 완료가 되는 것을 대기하는 최대 인터벌 (밀리 세컨드 단위)입니다. timeout 하지만 INFTIM (-1)의 경우, poll() (은)는 무기한으로 블록 합니다. timeout 하지만 0 의 경우 poll() (은)는 블록 하지 않고 돌아옵니다.

반환값
poll() (은)는 입출력의 준비가 완료한 기술자의 번호를 돌려줍니다. 에러가 일어났을 경우는 -1 을 돌려줍니다. 마감 시간이 되면(자) poll() (은)는 0 을 돌려줍니다. 끼어들어 호출에 의한 에러도 포함해 poll() 하지만 에러로 돌아왔을 경우, fds 배열은 변경되지 않습니다.

호환성
이 실장은, 파일 기술자에 의해 poll() 하지만 에러가 되지 않는다고 하는 점으로, 과거의 것과 다르고 있습니다. 과거의 실장에 대해 에러가 될 경우 (예를 들어 revoke(2) 된 기술자를 검사하려고 했을 경우), 이 실장은 대신에 events 비트 마스크를 revents 비트 마스크에 카피합니다. 이 기술자상에서 입출력을 실행하려고 하면(자) 에러가 돌려주어집니다. 이 동작은 보다 편리하다라고 생각되고 있습니다.

에러
poll() (은)는 다음의 에러로 돌아옵니다.

[EFAULT]
    fds (은)는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EINTR]
    마감 시간이 되기 전에, 그리고 선택된 이벤트가 발생하기 전에 시그널을 수신했습니다.

[EINVAL]
    시간제한으로서 부의 값이 지정되었습니다.

관련 항목
accept(2), connect(2), read(2), recv(2), select(2), send(2), write(2)

버그
events 비트 마스크와 revents 비트 마스크의 몇개의 필드간의 차이는, STREAMS 이외에서는 실용적이지는 않습니다. 그러한 필드는, 기존의 소프트웨어와의 호환성을 유지하기 위해서(때문에) 정의되고 있습니다.

역사
poll() 함수는 AT&T UNIX 그리고 등장했습니다. 이 메뉴얼 페이지와 실장의 주요한 부분은 NetBSD (으)로부터 얻은 것입니다.