select

select(2)                      2007-10-27-16:31                      select(2)



 ÐÐÐÐÐ
       select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO -
       багаÑопоÑоковий ÑинÑÑонний ввÑд/вивÑд


 СÐÐТÐÐСÐС
       #include <sys/time.h>
         #include <sys/types.h>
         #include <unistd.h>

       int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
       struct timeval *timeout);

       FD_CLR(int  fd , fd_set * set );
         FD_ISSET(int  fd , fd_set * set );
         FD_SET(int  fd , fd_set * set );
         FD_ZERO(fd_set * set );


 ÐÐÐС
       select оÑÑкÑÑ Ð·Ð¼Ñни ÑÑÐ°Ð½Ñ Ð´ÐµÐºÑлÑÐºÐ¾Ñ ÑайловиÑ
       деÑкÑипÑоÑÑв.

       ÐÑдÑлÑдковÑÑÑÑÑÑ ÑÑи Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñи
       деÑкÑипÑоÑÑв. ТÑ, Ñо пеÑеÑаÑÐ¾Ð²Ð°Ð½Ñ Ñ readfds , бÑдÑÑÑ
       вÑдÑлÑдковÑваÑиÑÑ Ð´Ð»Ñ Ñого, Ñоб виÑвиÑи поÑвÑ
       ÑимволÑв, доÑÑÑÐ¿Ð½Ð¸Ñ Ð´Ð»Ñ Ð·ÑиÑÑÐ²Ð°Ð½Ð½Ñ (ÑоÑнÑÑе
       кажÑÑи, Ñоб взнаÑи, Ñи не бÑде блоковано
       зÑиÑÑваннÑ; деÑкÑипÑÐ¾Ñ ÑÐ°Ð¹Ð»Ñ Ñакож бÑде
       вказÑваÑи на кÑнеÑÑ ÑайлÑ); ÑÑ Ð´ÐµÑкÑипÑоÑи, Ñо
       Ð²ÐºÐ°Ð·Ð°Ð½Ñ Ñ writefds , бÑдÑÑÑ Ð²ÑдÑлÑдковÑваÑиÑÑ Ð´Ð»Ñ
       Ñого, Ñоб взнаÑи, Ñи не заблоковано пÑоÑеÑ
       запиÑÑ; ÑÑ Ð¶, Ñо Ð²ÐºÐ°Ð·Ð°Ð½Ñ Ð² паÑамеÑÑÑ exceptfds ,
       бÑдÑÑÑ Ð²ÑдÑлÑдковÑваÑиÑÑ Ð´Ð»Ñ Ð²Ð¸ÑвленнÑ
       винÑÑÐºÐ¾Ð²Ð¸Ñ ÑиÑÑаÑÑй. Ðа повеÑÐ½ÐµÐ½Ð½Ñ Ð· ÑÑнкÑÑÑ,
       набоÑи деÑкÑипÑоÑÑв модиÑÑкÑÑÑÑÑÑ, Ñоб
       показаÑи, ÑÐºÑ Ð´ÐµÑкÑипÑоÑи ÑакÑиÑно змÑнили
       ÑвÑй ÑÑан.

       ÐÐ»Ñ Ð¼Ð°Ð½ÑпÑлÑÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð±Ð¾Ñами ÑÑнÑÑ ÑоÑиÑи
       макÑоÑи: FD_ZERO - оÑиÑÑÑ Ð½Ð°Ð±ÑÑ; FD_SET Ñ FD_CLR -
       додаÑÑÑ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ деÑкÑипÑÐ¾Ñ Ð´Ð¾ набоÑÑ Ñи
       видалÑÑÑÑ Ð¹Ð¾Ð³Ð¾ з набоÑÑ; FD_ISSET - пеÑевÑÑÑÑ, Ñи Ñ
       деÑкÑипÑÐ¾Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð½Ð°Ð±Ð¾ÑÑ; Ñей макÑÐ¾Ñ ÑÑÐ°Ñ Ð²
       Ð½Ð°Ð³Ð¾Ð´Ñ Ð¿ÑÑÐ»Ñ Ð¿Ð¾Ð²ÐµÑÐ½ÐµÐ½Ð½Ñ Ð· ÑÑнкÑÑÑ select .

       n на одиниÑÑ Ð±ÑлÑÑе найбÑлÑÑого номеÑа
       деÑкÑипÑоÑа з вÑÑÑ Ð½Ð°Ð±Ð¾ÑÑв.

       R timeout  - Ñе веÑÑÐ½Ñ Ð¼ÐµÐ¶Ð° ÑаÑÑ, Ñкий пÑойде
       пеÑед повеÑненнÑм з select . Ðожна
       викоÑиÑÑовÑваÑи нÑлÑове знаÑеннÑ, в ÑÑомÑ
       Ð²Ð¸Ð¿Ð°Ð´ÐºÑ select завеÑÑиÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾.  Ðоли timeout
       доÑÑвнÑÑ NULL (Ð½ÐµÐ¼Ð°Ñ ÑаÑÑ Ð¾ÑÑкÑваннÑ), Ñо select
       оÑÑкÑваÑиме на змÑни невизнаÑений ÑаÑ.


 ÐÐÐÐРТÐÐ ÐÐÐЧÐÐÐЯ
       Ð ÑÐ°Ð·Ñ ÑÑпÑÑного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ select повеÑÑаÑ
       кÑлÑкÑÑÑÑ Ð´ÐµÑкÑипÑоÑÑв, Ñо знаÑодÑÑÑÑÑ Ð² набоÑаÑ,
       ÑÑ ÐºÑлÑкÑÑÑÑ Ð¼Ð¾Ð¶Ðµ доÑÑвнÑваÑи нÑлÑ, ÑкÑо ÑаÑ
       оÑÑкÑÐ²Ð°Ð½Ð½Ñ Ð±Ñде пеÑевиÑено до Ñого Ñк
       вÑдбÑдÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ Ñо Ð½Ð°Ñ ÑÑкавлÑÑÑ. Ð ÑазÑ
       помилки знаÑÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑÐ½ÐµÐ½Ð½Ñ ÑÑвне -1, а
       змÑннÑй errno пÑиÑвоÑÑÑÑÑÑ ÐºÐ¾Ð´ помилки; набоÑи
       деÑкÑипÑоÑÑв Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ timeout ÑÑаÑÑÑ
       невизнаÑеними, ÑÐ¾Ð¼Ñ Ð² ÑÐ°Ð·Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ не
       можна покладаÑиÑÑ Ð½Ð° ÑÑ Ð·Ð½Ð°ÑеннÑ.


 ÐÐÐÐ ÐÐÐÐÐÐÐ
   EBADF
       Ð Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð· набоÑÑв знаÑодиÑÑÑÑ Ð½ÐµÐ²ÑÑний
       Ñайловий деÑкÑипÑоÑ.


   EINTR
       ÐÑло оÑÑимано незаблокований ÑиÒнал.


   EINVAL
       знаÑÐµÐ½Ð½Ñ n вÑд'Ñмне.


   ENOMEM
       ФÑнкÑÑÑ select не може видÑлиÑи необÑÑдний
       об'Ñм пам'ÑÑÑ Ð´Ð»Ñ Ð²Ð½ÑÑÑÑÑнÑÑ ÑаблиÑÑ.


 ÐÐ ÐÐÐТÐÐ
       РдеÑÐºÐ¸Ñ Ð¿ÑогÑÐ°Ð¼Ð°Ñ select викликаÑÑÑÑÑ ÑÑÑома
       поÑожнÑми набоÑами ÑайлÑв, пÑи ÑÑÐ¾Ð¼Ñ n
       доÑÑвнÑÑ Ð½ÑлÑ, а знаÑÐµÐ½Ð½Ñ R timeout  не ÑÑвне нÑлÑ,
       Ñ Ñе непоганий ÑпоÑÑб зÑобиÑи заÑÑÐ¸Ð¼ÐºÑ Ð·
       мÑлÑÑекÑÐ½Ð´Ð½Ð¾Ñ  ÑоÑнÑÑÑÑ, Ñо дÑÑ Ð½Ð° бÑлÑÑоÑÑÑ
       плаÑÑоÑм.

       Ð Linux, timeout змÑнÑÑÑÑÑÑ, Ñоб повÑдомиÑи пÑо
       невикоÑиÑÑÐ°Ð½Ñ ÐºÑлÑкÑÑÑÑ ÑаÑÑ; бÑлÑÑÑÑÑÑ ÑнÑиÑ
       ÑеалÑзаÑÑй не ÑоблÑÑÑ ÑÑого.  Це викликаÑ
       пÑоблеми, Ñк в ÐºÐ¾Ð´Ñ Ð¿Ñд Linux, Ñо зÑиÑÑÑ
       знаÑÐµÐ½Ð½Ñ timeout Ñ Ð¿ÐµÑеноÑиÑÑÑÑ Ð² ÑнÑÑ Ð¾Ð¿ÐµÑаÑÑйнÑ
       ÑиÑÑеми, Ñак Ñ Ð² ÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, коли код
       пеÑеноÑиÑÑÑÑ Ð² Linux, Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑ ÑÑÑÑкÑÑÑÑ timeval
       Ð´Ð»Ñ Ð´ÐµÐºÑлÑÐºÐ¾Ñ ÑÑнкÑÑй select в ÑÐ¸ÐºÐ»Ñ Ð±ÐµÐ·
       повÑоÑÐ½Ð¾Ñ ÑнÑÑÑалÑзаÑÑÑ.  ÐважайÑе, Ñо паÑамеÑÑ
       timeout невизнаÑено пÑÑÐ»Ñ Ð¿Ð¾Ð²ÐµÑÐ½ÐµÐ½Ð½Ñ Ð· ÑÑнкÑÑÑ
       select .


 ÐÐ ÐÐÐÐÐ
              #include <stdio.h>
              #include <sys/time.h>
              #include <sys/types.h>
              #include <unistd.h>

              int
              main(void)
              {
                  fd_set rfds;
                  struct timeval tv;
                  int retval;

                  /* ÐÑÑкÑÐ²Ð°Ð½Ð½Ñ Ð²Ð²Ð¾Ð´Ñ Ð½Ð° stdin (fd 0). */
                  FD_ZERO(&rfds);
                  FD_SET(0, &rfds);
                  /* ÐÑÑкÑÑмо не бÑлÑÑе п'ÑÑи Ñвилин. */
                  tv.tv_sec = 5;
                  tv.tv_usec = 0;

                  retval = select(1, &rfds, NULL, NULL, &tv);
                  /* Ðе покладаÑмоÑÑ Ð½Ð° знаÑÐµÐ½Ð½Ñ tv! */

                  if (retval)
                      printf(ÐÐ°Ð½Ñ Ð´Ð¾ÑÑÑпнÑ.\n);
                      /* ÐаÑаз FD_ISSET(0, &rfds) повеÑне ÑпÑÐ°Ð²Ð¶Ð½Ñ Ð·Ð½Ð°ÑеннÑ. */
                  else
                      printf(ÐÐ°Ð½Ð½Ñ Ð½Ðµ з'ÑвилиÑÑ Ð½Ð° пÑоÑÑÐ·Ñ Ð¿'ÑÑи ÑекÑнд.\n);

                  exit(0);
              }



 ÐÐÐÐÐÐÐÐÐÐСТЬ
       4.4BSD (ÑÑнкÑÑÑ select впеÑÑе з'ÑвилаÑÑ Ð² 4.2BSD).
       ÐазвиÑай пеÑеноÑиÑÑÑÑ Ð· ÑиÑÑем, Ñо не належаÑÑ
       до BSD Ñ Ð½Ð° ниÑ, ÑкÑо вони пÑдÑÑимÑÑÑÑ ÑÑвенÑ
       BSD-ÑокеÑÑв (вклÑÑаÑÑи ваÑÑанÑи System V). ХоÑа,
       заÑважÑе, Ñо ваÑÑанÑи System V зазвиÑай
       вÑÑановлÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ timeout пеÑед
       виÑодом, а ваÑÑÐ°Ð½Ñ BSD - нÑ.


 ÐÐÐ. ТÐÐÐÐ
       accept(2), connect(2), poll(2), read(2), recv(2), send(2), write(2)




© 2005-2007 DLOU, GNU FDL     2007-10-27-16:31                      select(2)