epoll_wait

EPOLL_WAIT(2)   Ð ÑководÑÑво пÑогÑаммиÑÑа Linux   EPOLL_WAIT(2)



ÐÐЯ
       epoll_wait, epoll_pwait - ждаÑÑ ÑобÑÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð°/вÑвода
       на Ñайловом деÑкÑипÑоÑе epoll

ÐÐÐÐÐ
       #include <sys/epoll.h>

       int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);
       int epoll_pwait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout,
                      const sigset_t *sigmask);

ÐÐÐСÐÐÐÐ
       СиÑÑемнÑй вÑзов epoll_wait() Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑобÑÑÐ¸Ñ Ð½Ð°
       ÑкземплÑÑе epoll(7), на коÑоÑÑй ÑказÑваеÑ
       ÑайловÑй деÑкÑипÑÐ¾Ñ epfd. ÐблаÑÑÑ Ð¿Ð°Ð¼ÑÑи, на
       коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ events, бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑобÑÑиÑ,
       доÑÑÑпнÑе Ð´Ð»Ñ Ð²ÑзÑваемого. ÐÑзов epoll_wait()
       Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ Ð´Ð¾ maxevents ÑобÑÑий. ÐаÑамеÑÑ maxevents
       должен бÑÑÑ Ð±Ð¾Ð»ÑÑе нÑлÑ.

       РаÑгÑменÑе timeout ÑказÑваеÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво
       миллиÑекÑнд, на коÑоÑÑе бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñован
       epoll_wait(). ÐÑÐµÐ¼Ñ Ð¾ÑÑлеживаеÑÑÑ Ð¿Ð¾ ÑаÑам
       CLOCK_MONOTONIC. ÐÑзов бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñован пока:

       *  ÑобÑÑие не бÑÐ´ÐµÑ Ð´Ð¾ÑÑавлено в ÑайловÑй
          деÑкÑипÑоÑ;

       *  вÑзов не пÑеÑвÑÑÑÑ Ð¾Ð±ÑабоÑÑиком Ñигнала;

       *  не иÑÑеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ.

       ÐамеÑим, ÑÑо инÑеÑвал timeout бÑÐ´ÐµÑ Ð¾ÐºÑÑглÑн в
       ÑооÑвеÑÑÑвии Ñ ÑоÑноÑÑÑÑ ÑиÑÑемнÑÑ ÑаÑов, а
       задеÑжки ÑдеÑного планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑиведÑÑ Ðº
       ÑомÑ, ÑÑо инÑеÑвал блокиÑовки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
       немного болÑÑе. ÐÑли пÑиÑвоиÑÑ timeout
       знаÑение -1, Ñо epoll_wait() блокиÑÑеÑÑÑ Ð½Ð°Ð²Ñегда;
       еÑли знаÑение timeout Ñавно 0, Ñо epoll_wait() ÑÑазÑ
       завеÑÑÐ°ÐµÑ ÑабоÑÑ, даже еÑли Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ ÑобÑÑий
       не пÑоизоÑло.

       СÑÑÑкÑÑÑа struct epoll_event опÑеделена Ñак:

           typedef union epoll_data {
               void    *ptr;
               int      fd;
               uint32_t u32;
               uint64_t u64;
           } epoll_data_t;

           struct epoll_event {
               uint32_t     events;    /* СобÑÑÐ¸Ñ epoll */
               epoll_data_t data;      /* ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ */
           };

       Ðоле data в каждой возвÑаÑаемой ÑÑÑÑкÑÑÑе
       бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе полÑзоваÑелÑ,
       ÑÑÑановленнÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ epoll_ctl(2) (EPOLL_CTL_ADD,
       EPOLL_CTL_MOD), а в поле events бÑÐ´ÐµÑ ÑодеÑжаÑÑÑÑ
       биÑовое поле возвÑаÑаемого ÑобÑÑиÑ.

   epoll_pwait()
       ÐÑноÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ epoll_wait() и epoll_pwait()
       аналогиÑÐ½Ñ ÑодÑÑÐ²Ñ select(2) и pselect(2): как
       pselect(2), epoll_pwait() позволÑÐµÑ Ð¿ÑиложениÑ
       безопаÑно ждаÑÑ, пока ÑайловÑй деÑкÑипÑоÑ
       не ÑÑÐ°Ð½ÐµÑ Ð³Ð¾Ñов или пока не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен
       Ñигнал.

       ÐÑзов epoll_pwait():

           ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask);

       ÑквиваленÑен аÑомаÑÐ½Ð¾Ð¼Ñ Ð²ÑполнениÑ
       ÑледÑÑÑÐ¸Ñ Ð²Ñзовов:

           sigset_t origmask;

           pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
           ready = epoll_wait(epfd, &events, maxevents, timeout);
           pthread_sigmask(SIG_SETMASK, &origmask, NULL);

       ÐÑгÑÐ¼ÐµÐ½Ñ sigmask Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñавен NULL — в ÑÑом
       ÑлÑÑае epoll_pwait() ÑквиваленÑен epoll_wait().

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ноÑмалÑном вÑполнении epoll_wait()
       возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑайловÑÑ Ð´ÐµÑкÑипÑоÑов,
       гоÑовÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов ввода-вÑвода, или
       нолÑ, еÑли ни один ÑайловÑй деÑкÑипÑÐ¾Ñ Ð½Ðµ
       ÑÑал гоÑов за оÑведÑннÑе timeout миллиÑекÑнд.
       ÐÑи возникновении оÑибки epoll_wait()
       возвÑаÑÐ°ÐµÑ -1 и ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ errno в
       ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       EBADF  ÐнаÑение epfd не ÑвлÑеÑÑÑ Ð¿ÑавилÑнÑм
              ÑайловÑм деÑкÑипÑоÑом.

       EFAULT ÐамÑÑÑ, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ events, недоÑÑÑпна на
              запиÑÑ Ð¸Ð·-за пÑав доÑÑÑпа.

       EINTR  ÐÑзов бÑл пÑеÑван обÑабоÑÑиком Ñигнала
              до Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð»Ñбого из
              запÑоÑеннÑÑ ÑобÑÑий или иÑÑеÑÐµÐ½Ð¸Ñ timeout;
              Ñм. signal(7).

       EINVAL epfd не ÑвлÑеÑÑÑ ÑайловÑм деÑкÑипÑоÑом epoll,
              или maxevents менÑÑе или Ñавно нÑлÑ.

ÐÐРСÐÐ
       ÐÑзов epoll_wait() бÑл добавлен в ÑдÑо веÑÑии 2.6.
       Ð glibc ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿Ð¾ÑвилаÑÑ Ð² веÑÑии
       2.3.2.

       ÐÑзов epoll_pwait() бÑл добавлен в ÑдÑо Linux 2.6.19. Ð
       glibc ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿Ð¾ÑвилаÑÑ Ð² веÑÑии
       2.6.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐÑзов epoll_wait() еÑÑÑ ÑолÑко в Linux.

ÐÐÐÐЧÐÐÐЯ
       Ðока одна ниÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñована в вÑзове
       epoll_pwait(), в дÑÑгой ниÑи возможно добавиÑÑ
       ÑайловÑй деÑкÑипÑоÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑÑÑ
       ÑкземплÑÑом epoll. Ðак ÑолÑко новÑй ÑайловÑй
       деÑкÑипÑÐ¾Ñ ÑÑÐ°Ð½ÐµÑ Ð³Ð¾ÑовÑм, ÑÑо ÑазблокиÑÑеÑ
       вÑзов epoll_wait().

       ÐбÑÑждение Ñого, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑлÑÑиÑÑÑÑ, еÑли
       ÑайловÑй деÑкÑипÑÐ¾Ñ Ð² ÑкземплÑÑе epoll
       оÑÑлеживаеÑÑÑ epoll_wait() и пÑи ÑÑом закÑÑваеÑÑÑ Ð²
       дÑÑгой ниÑи, ÑмоÑÑиÑе в select(2).

ÐÐФÐÐТЫ
       Ð ÑдÑÐ°Ñ Ð´Ð¾ веÑÑии 2.6.37, еÑли знаÑение timeout
       болÑÑе Ñем пÑиблизиÑелÑное LONG_MAX / HZ ÑекÑнд,
       Ñо оно воÑпÑинимаеÑÑÑ ÐºÐ°Ðº -1 (Ñ.е.,
       беÑконеÑноÑÑÑ). То еÑÑÑ, напÑимеÑ, в ÑиÑÑеме,
       где sizeof(long) Ñавно 4 и знаÑение ÑдÑа HZ Ñавно
       1000, задеÑжка более 35,79 минÑÑ ÑÑиÑаеÑÑÑ
       беÑконеÑноÑÑÑÑ.

   ÐÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой C и ÑдÑом
       ЯдеÑнÑй ÑиÑÑемнÑй вÑзов epoll_pwait() Ð¸Ð¼ÐµÐµÑ ÑеÑÑой
       аÑгÑменÑ, size_t sigsetsize, в коÑоÑом ÑказÑваеÑÑÑ
       ÑÐ°Ð·Ð¼ÐµÑ Ð°ÑгÑменÑа sigmask в байÑаÑ. РобÑÑÑоÑной
       ÑÑнкÑии glibc epoll_pwait() в ÑÑом аÑгÑменÑе
       пеÑедаÑÑÑÑ Ð¿Ð¾ÑÑоÑÐ½Ð½Ð°Ñ Ð²ÐµÐ»Ð¸Ñина (ÑавнаÑ
       sizeof(sigset_t)).

СÐÐТРÐТРТÐÐÐÐ
       epoll_create(2), epoll_ctl(2), epoll(7)



Linux                             2015-05-07                     EPOLL_WAIT(2)