Rechercher une page de manuel
select
Langue: ja
Version: 2006-03-11 (openSuse - 09/10/07)
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)
Contenus ©2006-2023 Benjamin Poulain
Design ©2006-2023 Maxime Vantorre