select

SELECT(2)                  리ëì¤ íë¡ê·¸ë머 매ë´ì¼                 SELECT(2)



ì´ë¦
       select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - ëê¸°ì  I/O ë¤ì¤í

ì¬ì©ë²
       #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 ì 리ì¤í¸ë ê²ë¤ì
       문ìë¤ì ì½ì´ë¤ì¼ì ìëê°ê° ê²ì¬ëë©°(ë ì ííë, ì½ê¸°ê° ë´ìëì§ ììëì§ë¥¼
       ê²ì¬í기 ìí´ìì´ë¤ - í¹ë³í, íì¼ ê¸°ì ì ëí end-of-file ì¼ìë ìë¤.),
       writefds ì ìë ê²ë¤ì ì°ê¸°ê° ë´ìëì§ ììëê°ê° ê²ì¬ëë©° exceptfds ì ìë
       ê²ë¤ì ìì¸ê° ìëì§ê° ê²ì¬ëë¤.  ì¢ë£ì, ì´ ì§í©ë¤ì íì¼ ê¸°ì ìë¤ì´ ì¤ì ë¡
       ë³ê²½ë ìíê° ë¬´ìì¸ì§ ê°ë¦¬í¤ëë¡ ìì ëë¤.

       ë¤ê°ì 매í¬ë¡ê° ì´ ì§í©ë¤ì ì ì´í기 ìí´ ì¬ì©ëë¤.  FD_ZERO ë ì§í©ì
       ìê±°íë¤.  FD_SET ì FD_CLR ë ì§í©ìì 주ì´ì§ 기ì ì를 ëíê±°ë ëºë¤.
       FD_ISSET ë 기ì ìê° ì§í©ì ì¼ë¶ë¶ì¸ì§ ìëì§ë¥¼ ê²ì¬íë¤.: ì´ê²ì select ê°
       ë°íëí ì ì©íë¤.

       n ì ì¸ê°ì ì§í©ì¤ ê°ì¥ ëì íì¼ê¸°ì ììë¤ê° 1ì ëíë¤.

       timeout ì select ê° ë°íí기 ì ì 경과í´ì¼ íë ìê°ì ìì ì í ê°ì´ë¤.
       0ì¼ë¡ ì§ì ëë©´ select ë ì¦ì ë°íëë¤.  ë§ì¼ timeout ì´
       NULLì´ë©´(timeoutì´ ììê²½ì°), select ë 무íí ë´ìë ì ìë¤.

ë°íê°
       ì±ê³µì, select ë íì¼ ê¸°ì ì ì§í©ì í¬í¨ë 기ì ìë¤ì ì«ì를 ë°ííë©°, ì´ë í
       ì¼ì´ ì¼ì´ë기 ì ì íìììì´ ë°ìíë©´ 0ì ë°ííë¤.  ìë¬ì, -1ì´ ë°íëë©°, errno
       ë ì ë¹í ê°ì¼ë¡ ì¤ì ëë¤.; ì§í©ë¤ê³¼ timeout ì ì ìê° ìëë©°, ê·¸ëì ìë¬í
       ì´ê²ë¤ì ë´ì©ì ìì§í ì ìë¤.

ìë¬
       EBADF  ì í¨íì§ ìì íì¼ ê¸°ì ìê° ì§í©ì¤ íëì ë¤ì´ ìë¤.

       EINTR  ë¹-ë¸ëë ì í¸ê° ì¡íë¤.

       EINVAL n ì´ ììì´ë¤.

       ENOMEM select ê° ë´ë¶ íì´ë¸ë¤ì ìí ë©ëª¨ë¦¬ë¥¼ í ë¹í ì ìë¤.

주ì
       ëªëª ì½ëë¤ì ì íì±ì ê°ì§ê³  ì ë³µìí¤ê¸° ìí´ ê½¤ í¸íëë ë°©ë²ì¼ë¡ì¨ ì¸ê°ì
       ì§í©ì ë¹ì°ê³ , n ì 0, ê·¸ë¦¬ê³  timeout ì nullì´ ìëê² ì¤ì íì¬ select
       를 í¸ì¶íë¤.

       리ëì¤ìì, timeout ì ì ë³µëì§ ìì ìê°ì ìì ë°ìí기 ìí´ ìì ëë¤; ëë¶ë¶ì
       ë¤ë¥¸ ìíë¤ì ì´ë ê² ëì§ ìëë¤. ì´ê²ì timeout ì ì½ì 리ëì¤ ì½ëë¤ì´ ë¤ë¥¸
       OSë¡ í¬íëê±°ë ì½ëë¤ì´ ì´ê¸°í를 ë¤ì íì§ ìê³  ë°ë³µë¬¸ìì ë¤ì¤ selects
       를 ìí´ timeval 구조체를 ë¤ì ì¬ì©íì¬ ë¦¬ëì¤ë¡ í¬íí ë 문ì ë¤ì
       ì¼ê¸°íë¤.  select ìì ë°íëí ì ìëì§ ìì timeout ì ê³ ë ¤í´ì¼ íë¤.

ìì
       #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);
           /* 5ì´ë¥¼ 기ë¤ë¦°ë¤. */
           tv.tv_sec = 5;
           tv.tv_usec = 0;

           retval = select(1, &rfds, NULL, NULL, &tv);
           /* ì§ê¸ tv ê°ì ìì¡´íì§ ë§ë¼. */

           if (retval)
               printf("Data is available now.\n");
               /* FD_ISSET(0, &rfds) ë trueì´ë¤. */
           else
               printf("No data within five seconds.\n");

           exit(0);
       }

í¸í
       4.4BSD ( select í¨ìë 4.2BSDìì ì²ì ëíë¬ë¤.). ì¼ë°ì ì¼ë¡ BSD ìì¼
       층(System V ë³ì¢ë¤ì í¬í¨íì¬)ì ë³µì¬íë¤ì ì§ìíë non-BSDê³ì´ê³¼ í¸íëë¤.
       ê·¸ë¬ë, System V ë³ì¢ë¤ì  ì íì ì¼ë¡ ì¢ë£ì ì timeout ë³ì를 ì¤ì íì§ë§,
       BSD ë³ì¢ë¤ì ê·¸ë ê² íì§ ìëë¤ëê²ì 주ìí´ë¼.

ê´ë ¨ í목
       accept(2), connect(2), poll(2), read(2), recv(2), send(2), write(2)

ìì
       ì ê°í  <skyeyes@soback.kornet.net>, 2000ë 7ì 1ì¼



Linux 1.2                        1996ë 2ì 11ì¼                       SELECT(2)