select

Autres langues

Langue: ja

Version: 2006-03-11 (openSuse - 09/10/07)

Autres sections - même nom

Section: 2 (Appels système)

̾Á°

select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - ¿½Å²½¤µ¤ì¤¿ I/O ¤ÎƱ´ü¤ò¤È¤ë

½ñ¼°


/* POSIX.1-2001 ¤Ë½¾¤¦¾ì¹ç */


#include <sys/select.h> /* °ÊÁ°¤Îµ¬³Ê¤Ë½¾¤¦¾ì¹ç */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set); #define _XOPEN_SOURCE 600 #include <sys/select.h> int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);

ÀâÌÀ

select() ¤ä pselect() ¤ò»È¤¦¤È¡¢¥×¥í¥°¥é¥à¤ÇÊ£¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò´Æ»ë¤·¡¢ °ì¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬¤¢¤ë¼ï¤Î I/O Áàºî¤Î ¡Öready (½àÈ÷¤¬¤Ç¤­¤¿)¡×¾õÂÖ (Î㤨¤Ð¡¢Æɤ߹þ¤ß²Äǽ¤Ë¤Ê¤Ã¤¿¾õÂÖ) ¤Ë¤Ê¤ë¤Þ¤ÇÂԤĤ³¤È¤¬¤Ç¤­¤ë¡£ ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ ready (½àÈ÷¤¬¤Ç¤­¤¿) ¤È¤Ï¡¢ Âбþ¤¹¤ë I/O Áàºî (Î㤨¤Ð read(2) ¤Ê¤É) ¤¬Ää»ß (block) ¤Ê¤·¤Ë¼Â¹Ô²Äǽ¤Ê¾õÂ֤ˤ¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£

select() ¤È pselect() ¤ÎÆ°ºî¤ÏƱ¤¸¤Ç¤¢¤ë¤¬¡¢°Ê²¼¤Î 3 ÅÀ¤¬°Û¤Ê¤ë:

(i)
select() ¤Ç¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¤Î»ØÄê¤Ë¹½Â¤ÂÎ struct timeval (Éᦥޥ¤¥¯¥íÉÃñ°Ì) ¤òÍѤ¤¤ë¡£ °ìÊý¡¢ pselect() ´Ø¿ô¤Ç¤Ï¡¢¹½Â¤ÂÎ struct timespec (ÉᦥʥÎÉÃñ°Ì) ¤òÍѤ¤¤ë¡£
(ii)
select() ¤Ï»Ä¤ê»þ´Ö¤ò¼¨¤¹ timeout °ú¤­¿ô¤ò¹¹¿·¤¹¤ë¤³¤È¤¬¤¢¤ë¡£ pselect() ¤Ï¤³¤Î°ú¤­¿ô¤òÊѹ¹¤·¤Ê¤¤¡£
(iii)
select() ¤Ï sigmask °ú¤­¿ô¤ò»ý¤¿¤Ê¤¤¡£¤½¤ÎÆ°ºî¤Ï sigmask ¤Ë NULL ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î pselect() ¤ÈƱ¤¸¤Ç¤¢¤ë¡£

3 ¤Ä¤ÎÆÈΩ¤·¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Î´Æ»ë¤ò¹Ô¤¦¡£ readfds ¤ËÆþ¤ì¤é¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ä¤¤¤Æ¤Ï¡¢Æɤ߹þ¤ß¤¬²Äǽ¤«¤É¤¦¤«¤ò ´Æ»ë¤¹¤ë (¤è¤êÀµ³Î¤Ë¤¤¤¦¤È¡¢Ää»ß (block) ¤Ê¤·¤ÇÆɤळ¤È¤¬¤Ç¤­¤ë¤«¤ò Ä´¤Ù¤ë¡£¥Õ¥¡¥¤¥ë¤Î½ªÃ¼ (end-of-file) ¤Î¾ì¹ç¤â¡¢ ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÏÆɤ߹þ¤ß²Äǽ¤È¤·¤Æ°·¤ï¤ì¤ë)¡£ writefds ¤ËÆþ¤ì¤é¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ä¤¤¤Æ¤Ï¡¢Ää»ß¤»¤º¤Ë½ñ¤­¹þ¤ß¤¬ ²Äǽ¤«¤É¤¦¤«¤ò´Æ»ë¤¹¤ë¡£ exceptfds ¤Ë¤¢¤ë¤â¤Î¤Ë¤Ä¤¤¤Æ¤Ï¡¢Îã³°¤Î´Æ»ë¤ò¹Ô¤Ê¤¦¡£¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ»»þ¤Ë¡¢ ¤É¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¾õÂÖ¤¬¼ÂºÝ¤ËÊѲ½¤·¤¿¤«¼¨¤¹¤¿¤á¤Ë¡¢ ½¸¹ç¤ÎÆâÍƤ¬Êѹ¹¤µ¤ì¤ë¡£ ¤¢¤ë¼ïÊ̤Υ¤¥Ù¥ó¥È¤ò´Æ»ë¤·¤¿¤¤¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬°ì¤Ä¤â¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ Âбþ¤¹¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ë NULL ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

½¸¹ç¤òÁàºî¤¹¤ë¤¿¤á¤Ë 4 ¤Ä¤Î¥Þ¥¯¥í¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¡£ FD_ZERO() ¤Ï½¸¹ç¤ò¾Ãµî¤¹¤ë¡£ FD_SET() ¤È FD_CLR() ¤Ï¤½¤ì¤¾¤ì»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î½¸¹ç¤Ø¤ÎÄɲᢺï½ü¤ò¹Ô¤¦¡£ FD_ISSET() ¤Ï½¸¹ç¤Ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬¤¢¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë; ¤³¤ì¤Ï select() ¤¬½ªÎ»¤·¤¿¸å¤Ë»È¤¦¤ÈÊØÍø¤Ç¤¢¤ë¡£

nfds ¤Ï 3 ¤Ä¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎºÇÂçÃÍ¤Ë 1 ¤ò­¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£

timeout ¤Ï select() ¤¬Éüµ¢¤¹¤ë¤Þ¤Ç¤Î·Ð²á»þ´Ö¤Î¾å¸Â¤Ç¤¢¤ë¡£¤³¤ì¤Ï 0 ¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢ ¤½¤Î¾ì¹ç¤Ï select() ¤Ï¤¹¤°¤ËÉüµ¢¤¹¤ë (¤³¤Îµ¡Ç½¤Ï¥Ý¡¼¥ê¥ó¥° (polling) ¤ò¹Ô¤¦¤Î¤ËÊØÍø¤Ç¤¢¤ë)¡£ timeout ¤Ë NULL (¥¿¥¤¥à¥¢¥¦¥È¤Ê¤·) ¤¬»ØÄꤵ¤ì¤ë¤È¡¢ select() ¤Ï̵´ü¸Â¤ËÄä»ß (block) ¤¹¤ë¡£

sigmask ¤Ï¡¢¥·¥°¥Ê¥ë¥Þ¥¹¥¯ (sigprocmask(2) ¤ò»²¾È) ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ sigmask ¤¬ NULL ¤Ç¤Ê¤¤¾ì¹ç¡¢ pselect() ¤Ï sigmask ¤¬»Ø¤·¤Æ¤¤¤ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤Ç¸½ºß¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤òÃÖ¤­´¹¤¨¤Æ¤«¤é¡¢ `select' ´Ø¿ô¤ò¼Â¹Ô¤·¡¢ ½ªÎ»¸å¤Ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ò¸µ¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ËÌ᤹¡£

timeout °ú¤­¿ô¤ÎÀºÅ٤ΰ㤤¤ò½ü¤¯¤È¡¢°Ê²¼¤Î pselect() ¤Î¸Æ¤Ó½Ð¤·¤Ï¡¢




    ready = pselect(nfds, &readfds, &writefds, &exceptfds,

                    timeout, &sigmask);



¼¡¤Î¥³¡¼¥ë¤ò atomic ¤Ë¼Â¹Ô¤¹¤ë¤Î¤ÈÅù²Á¤Ç¤¢¤ë¡£



    sigset_t origmask;



    sigprocmask(SIG_SETMASK, &sigmask, &origmask);

    ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);

    sigprocmask(SIG_SETMASK, &origmask, NULL);

pselect() ¤¬É¬ÍפˤʤëÍýͳ¤Ï¡¢¥·¥°¥Ê¥ë¤ä¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¾õÂÖÊѲ½¤ò ÂÔ¤Á¤¿¤¤¤È¤­¤Ë¤Ï¡¢¶¥¹ç¾õÂÖ¤òÈò¤±¤ë¤¿¤á¤Ë atomic ¤Ê¥Æ¥¹¥È¤¬É¬Í×¤Ë¤Ê¤ë ¤«¤é¤Ç¤¢¤ë¡£ (¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬Âç°è¥Õ¥é¥°¤òÀßÄꤷ¤ÆÌá¤ë¾ì¹ç¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡£ ¤³¤ÎÂç°è¥Õ¥é¥°¤Î¥Æ¥¹¥È¤Ë³¤±¤Æ select() ¤ò¸Æ¤Ó½Ð¤¹¤È¡¢ ¥·¥°¥Ê¥ë¤¬¥Æ¥¹¥È¤Îľ¸å¤«¤Ä¸Æ¤Ó½Ð¤·¤ÎľÁ°¤ËÆϤ¤¤¿»þ¤Ë¤Ï select() ¤Ï±Êµ×¤Ë¥Ï¥ó¥°¤·¤Æ¤·¤Þ¤¦¤«¤â¤·¤ì¤Ê¤¤¡£ °ìÊý¡¢ pselect() ¤ò»È¤¦¤È¡¢¤Þ¤º¥·¥°¥Ê¥ë¤ò¶Ø»ß (block) ¤·¤Æ¡¢Æþ¤Ã¤Æ¤¯¤ë¥·¥°¥Ê¥ë¤òÁàºî¤·¡¢ ˾¤ß¤Î sigmask ¤Ç pselect() ¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¡¢Á°µ­¤Î¶¥¹ç¤òÈò¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£)

¥¿¥¤¥à¥¢¥¦¥È

¤³¤ì¤é¤Î´Ø¿ô¤Ç»ÈÍѤµ¤ì¤ë»þ´Ö´ØÏ¢¤Î¹½Â¤ÂΤϡ¢ <sys/time.h> ¤Ç°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£

struct timeval {

    long    tv_sec;         /* ÉÃ */

    long    tv_usec;        /* ¥Þ¥¤¥¯¥íÉà */

};


struct timespec {

    long    tv_sec;         /* ÉÃ */

    long    tv_nsec;        /* ¥Ê¥ÎÉà */

};

(POSIX.1-2001 ¤Ç¤ÎÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ï²¼µ­¤Î¡ÖÃí°Õ¡×¤ò»²¾È)

ÉÃñ°Ì°Ê²¼¤ÎÀºÅ٤ǥ¹¥ê¡¼¥×¤ò¼Â¸½¤¹¤ë °Ü¿¢À­¤Î¹â¤¤ÊýË¡¤È¤·¤Æ¡¢ 3 ¤Ä¤Î½¸¹çÁ´¤Æ¤ò¶õ¡¢ nfds ¤ò 0 ¡¢ timeout ¤ò NULL ¤Ç¤Ê¤¤ÃͤËÀßÄꤷ¤Æ select() ¤ò¸Æ¤Ó½Ð¤¹¤È¤¤¤¦ÊýË¡¤ò»È¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤â¤¢¤ë¡£

Linux ¤Ç¤Ï¡¢ select() ¤Ï timeout ¤òÊѹ¹¤·¡¢»Ä¤ê¤ÎÄä»ß»þ´Ö¤òÈ¿±Ç¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¬¡¢ ¾¤Î¤Û¤È¤ó¤É¤Î¼ÂÁõ¤Ç¤Ï¤³¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤¤ (POSIX.1-2001 ¤Ï¤É¤Á¤é¤ÎÆ°ºî¤âǧ¤á¤Æ¤¤¤ë)¡£ ¤³¤Î¤¿¤á¡¢ timeout ¤ò»²¾È¤·¤Æ¤¤¤ë Linux ¤Î¥³¡¼¥É¤ò¾¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ø °Ü¿¢¤¹¤ë¾ì¹ç¡¢ÌäÂ꤬µ¯¤³¤ë¡£ ¤Þ¤¿¡¢¥ë¡¼¥×¤ÎÃæ¤Ç timeval ¹½Â¤ÂΤò½é´ü²½¤»¤º¤Ë¤½¤Î¤Þ¤ÞºÆÍøÍѤ·¤Æ select() ¤òÊ£¿ô²ó¹Ô¤Ê¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤ò Linux ¤Ø°Ü¿¢¤¹¤ë¾ì¹ç¤Ë¤â¡¢ÌäÂ꤬µ¯¤³¤ë¡£ select() ¤«¤éÉüµ¢¤·¤¿¸å¤Ï timeout ¤Ï̤ÄêµÁ¤Ç¤¢¤ë¤È¹Í¤¨¤ë¤Ù¤­¤Ç¤¢¤ë¡£

ÊÖ¤êÃÍ

À®¸ù¤·¤¿¾ì¹ç¡¢ select() ¤È pselect() ¤Ï¹¹¿·¤µ¤ì¤¿ 3 ¤Ä¤Î¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¿ô (¤Ä¤Þ¤ê¡¢ readfds, writefds, exceptfds Ãæ¤Î 1 ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥Ó¥Ã¥È¤ÎÁí¿ô) ¤òÊÖ¤¹¡£ ²¿¤âµ¯¤³¤é¤º¤Ë»þ´ÖÀÚ¤ì¤Ë¤Ê¤Ã¤¿¾ì¹ç¡¢ ¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¿ô¤Ï 0 ¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ë¡£ ¥¨¥é¡¼¤Ê¤é¤Ð -1 ¤òÊÖ¤·¡¢ errno ¤ËŬÀÚ¤ÊÃͤ¬ÀßÄꤵ¤ì¤ë; ½¸¹ç¤È timeout ¤Ï̤ÄêµÁ¤È¤Ê¤ë¤Î¤Ç¡¢¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¸å¤Ï¤½¤ì¤é¤ÎÆâÍƤò¿®Íꤷ¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£

¥¨¥é¡¼

EBADF
¤¤¤º¤ì¤«¤Î½¸¹ç¤Ë̵¸ú¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬»ØÄꤵ¤ì¤¿ (¤ª¤½¤é¤¯¤Ï¡¢¤¹¤Ç¤Ë¥¯¥í¡¼¥º¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤«¡¢ ¥¨¥é¡¼¤¬È¯À¸¤·¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬»ØÄꤵ¤ì¤¿)¡£
EINTR
¥·¥°¥Ê¥ë¤ò¼õ¿®¤·¤¿¡£
EINVAL
n ¤¬Éé¡¢¤Þ¤¿¤Ï timeout ¤ËÆþ¤Ã¤Æ¤¤¤ëÃͤ¬ÉÔÀµ¤Ç¤¢¤ë¡£
ENOMEM
ÆâÉô¥Æ¡¼¥Ö¥ë¤Ë¥á¥â¥ê¤ò³ä¤êÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤«¤Ã¤¿¡£

¥Ð¡¼¥¸¥ç¥ó

pselect() ¤Ï¥«¡¼¥Í¥ë 2.6.16 ¤Ç Linux ¤ËÄɲ䵤줿¡£ ¤½¤ì°ÊÁ°¤Ï¡¢ pselect() ¤Ï glibc ¤Ç¥¨¥ß¥å¥ì¡¼¥È¤µ¤ì¤Æ¤¤¤¿ (¡Ö¥Ð¥°¡×¤Î¾Ï¤ò»²¾È)¡£

½àµò

select() ¤Ï POSIX.1-2001 ¤È 4.4BSD (select() ¤Ï 4.2BSD ¤ÇºÇ½é¤ËÅо줷¤¿) ¤Ë½àµò¤¹¤ë¡£ BSD ¥½¥±¥Ã¥ÈÁؤΥ¯¥í¡¼¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ëÈó BSD ¥·¥¹¥Æ¥à (System V ·Ï¤â´Þ¤à) ¤È¤Î´Ö¤Ç¤À¤¤¤¿¤¤°Ü¿¢À­¤¬¤¢¤ë¡£¤·¤«¤· System V ·Ï¤Ç¤Ï ¤¿¤¤¤¬¤¤ timeout ÊÑ¿ô¤ò exit ¤ÎÁ°¤Ë¥»¥Ã¥È¤¹¤ë¤¬¡¢ BSD ·Ï¤Ç¤Ï¤½¤¦¤Ç¤Ê¤¤¤Î¤ÇÃí°Õ¤¹¤ë¤³¤È¡£

pselect() ¤Ï POSIX.1g ¤È POSIX.1-2001 ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£

Ãí°Õ

fd_set ¤Ï¸ÇÄꥵ¥¤¥º¤Î¥Ð¥Ã¥Õ¥¡¤Ç¤¢¤ë¡£ Éé¤ä FD_SETSIZE °Ê¾å¤ÎÃͤò»ý¤Ä fd ¤ËÂФ·¤Æ FD_CLR() ¤ä FD_SET() ¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢ ¤É¤Î¤è¤¦¤ÊÆ°ºî¤ò¤¹¤ë¤«¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¡£ ¤Þ¤¿¡¢ POSIX ¤Ç¤Ï fd ¤ÏÍ­¸ú¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Èµ¬Äꤵ¤ì¤Æ¤¤¤ë¡£

·¿Àë¸À¤Ë´Ø¤·¤Æ¡£ÀΤʤ¬¤é¤Î¾õ¶·¤Ç¤Ï timeval ¹½Â¤ÂΤΠ2 ¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Ï (¾åµ­¤Î¤è¤¦¤Ë) ξÊý¤È¤â long ·¿¤Ç¤¢¤ê¡¢¹½Â¤ÂÎ¤Ï <sys/time.h> ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£ POSIX.1-2001 ¤Î²¼¤Ç¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£


struct timeval {

         time_t         tv_sec;     /* ÉÃ */

         suseconds_t    tv_usec;    /* ¥Þ¥¤¥¯¥íÉà */

};

¤³¤Î¹½Â¤ÂÎ¤Ï <sys/select.h> ¤ÇÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢¥Ç¡¼¥¿·¿ time_t ¤È suseconds_t ¤Ï <sys/types.h> ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£

¥×¥í¥È¥¿¥¤¥×¤Ë´Ø¤·¤Æ¤Ï¡¢ÀΤʤ¬¤é¤Î¾õ¶·¤Ç select() ¤ò»È¤¤¤¿¤¤¾ì¹ç¤Ï¡¢ <time.h> ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ì¤Ð¤è¤¤¡£ POSIX.1-2001 ¤Î´Ä¶­¤Ç select() ¤È pselect() ¤ò»È¤¤¤¿¤¤¾ì¹ç¤Ï¡¢ <sys/select.h> ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ì¤Ð¤è¤¤¡£ ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë <sys/select.h> ¤Ï libc4 ¤È libc5 ¤Ë¤Ï¤Ê¤¯¡¢glibc 2.0 °Ê¹ß¤Ë¸ºß¤¹¤ë¡£ °­¤¤¤³¤È¤Ë glibc 2.0 °ÊÁ°¤Ç¤Ï pselect() ¤Î¥×¥í¥È¥¿¥¤¥×¤¬´Ö°ã¤Ã¤Æ¤¤¤ë¡£ glibc 2.1-2.2.1 ¤Ç¤Ï _GNU_SOURCE ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¡¢ pselect() ¤¬Ä󶡤µ¤ì¤ë¡£ glibc 2.2.2-2.2.4 ¤Ç¤Ï _XOPEN_SOURCE ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¡¢¤½¤ÎÃͤ¬ 600 °Ê¾å¤Ç¤¢¤ë¾ì¹ç¤Ë pselect() ¤¬Ä󶡤µ¤ì¤ë¡£ ¤â¤Á¤í¤ó¡¢ POSIX.1-2001 °Ê¹ß¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥×¥í¥È¥¿¥¤¥×¤¬Ä󶡤µ¤ì¤ë¡£

Linux ¤Ç¤ÎÃí°Õ

Linux ¤Î pselect() ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï timeout °ú¤­¿ô¤òÊѹ¹¤¹¤ë¡£ ¤·¤«¤·¡¢ glibc ¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤ËÅϤ¹ timeout °ú¤­¿ô ¤È¤·¤Æ¥í¡¼¥«¥ëÊÑ¿ô¤ò»È¤¦¤³¤È¤Ç¤³¤ÎÆ°ºî¤ò±£Ê䷤Ƥ¤¤ë¡£ ¤³¤Î¤¿¤á¡¢glibc ¤Î pselect() ´Ø¿ô¤Ï timeout °ú¤­¿ô¤òÊѹ¹¤·¤Ê¤¤¡£ ¤³¤ì¤¬ POSIX.1-2001 ¤¬Í׵ᤷ¤Æ¤¤¤ëÆ°ºî¤Ç¤¢¤ë¡£

¥Ð¥°

glibc 2.0 ¤Ç¤Ï¡¢ sigmask °ú¤­¿ô¤ò¼è¤é¤Ê¤¤¥Ð¡¼¥¸¥ç¥ó¤Î pselect() ¤¬Ä󶡤µ¤ì¤Æ¤¤¤¿¡£

¥Ð¡¼¥¸¥ç¥ó 2.1 °Ê¹ß¤Î glibc ¤Ç¤Ï¡¢ pselect() ¤Ï sigprocmask(2) ¤È select() ¤ò»È¤Ã¤Æ¥¨¥ß¥å¥ì¡¼¥È¤µ¤ì¤Æ¤¤¤¿¡£ ¤³¤Î¼ÂÁõ¤Ë¤Ï¤­¤ï¤É¤¤¶¥¹ç¾ò·ï¤Ë¤ª¤¤¤ÆÀȼåÀ­¤¬»Ä¤Ã¤Æ¤¤¤ë¡£ ¤³¤Î¶¥¹ç¾ò·ï¤Ë¤ª¤±¤ëÌäÂê¤òËɻߤ¹¤ë¤¿¤á¤Ë pselect() ¤ÏÀ߷פµ¤ì¤¿¤Î¤Ç¤¢¤ë¡£ pselect() ¤¬¤Ê¤¤¥·¥¹¥Æ¥à¤Ë¤ª¤¤¤Æ¡¢ ¥·¥°¥Ê¥ë¤ÎÊ᪤ò¿®ÍêÀ­¤¬¤¢¤ê (°Ü¿¢À­¤â¹â¤¤) ÊýË¡¤Ç¹Ô¤¦¤Ë¤Ï¡¢ ¼«¸Ê¥Ñ¥¤¥× (self-pipe) ¤È¤¤¤¦µ»¤ò»È¤¦¤È¤è¤¤ (¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¥Ñ¥¤¥×¤Ø 1 ¥Ð¥¤¥È¤Î¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤ß¡¢Æ±¤¸¥Ñ¥¤¥×¤Î¤â¤¦°ìü¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤Î select() ¤Ç´Æ»ë¤¹¤ë¤È¤¤¤¦ÊýË¡¤Ç¤¢¤ë)¡£

Linux ¤Ç¤Ï¡¢ select() ¤¬¥½¥±¥Ã¥È¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç "Æɤ߹þ¤ß¤Î½àÈ÷¤¬¤Ç¤­¤¿" ¤ÈÊó¹ð¤·¤¿¾ì¹ç¤Ç¤â¡¢ ¤³¤Î¸å¤Ç read ¤ò¹Ô¤¦¤ÈÄä»ß (block) ¤¹¤ë¤³¤È¤¬¤¢¤ë¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢ Î㤨¤Ð¡¢¥Ç¡¼¥¿¤¬ÅþÃ夷¤¿¤¬¡¢¸¡ºº¤Ç¥Á¥§¥Ã¥¯¥µ¥à°Û¾ï¤¬¸«¤Ä¤«¤êÇÑ´þ¤µ¤ì¤¿»þ ¤Ê¤É¤Ëµ¯¤³¤ê¤¨¤ë¡£Â¾¤Ë¤â¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬½àÈ÷¤Ç¤­¤¿¤È´Ö°ã¤Ã¤Æ Êó¹ð¤µ¤ì¤ë¾õ¶·¤¬µ¯¤³¤ë¤«¤â¤·¤ì¤Ê¤¤¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢Ää»ß¤¹¤Ù¤­¤Ç¤Ï¤Ê¤¤¥½¥±¥Ã¥È¤ËÂФ·¤Æ¤Ï O_NONBLOCK ¤ò»È¤¦¤È ¤è¤ê°ÂÁ´¤Ç¤¢¤í¤¦¡£

Îã


#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 == -1)

        perror("select()");

    else if (retval)

        printf("º£¡¢¥Ç¡¼¥¿¤¬¼èÆÀ¤Ç¤­¤Þ¤·¤¿¡£\n");

        /* FD_ISSET(0, &rfds) ¤¬ true ¤Ë¤Ê¤ë¡£*/

    else

        printf("5 ÉðÊÆâ¤Ë¥Ç¡¼¥¿¤¬ÆþÎϤµ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£\n");



    exit(EXIT_SUCCESS);

}

´ØÏ¢¹àÌÜ

¹Í»¡¤È»ÈÍÑÎã¤Î½ñ¤«¤ì¤¿¥Á¥å¡¼¥È¥ê¥¢¥ë¤È¤·¤Æ¡¢ select_tut(2) ¤¬¤¢¤ë¡£

´Ø·¸¤¬¤¢¤ê¤½¤¦¤Ê¤â¤Î¤òµó¤²¤Æ¤ª¤¯: accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2), epoll(7), feature_test_macros(7)