select(2) - wariua/manpages-ko GitHub Wiki

NAME

select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - ๋™๊ธฐ์  I/O ๋‹ค์ค‘ํ™”

SYNOPSIS

/* POSIX.1-2001, POSIX.1-2008์— ๋”ฐ๋ฅด๋ฉด */
#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);

#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);

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

pselect():
_POSIX_C_SOURCE >= 200112L

DESCRIPTION

select()์™€ pselect()๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—ฌ๋Ÿฌ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๊ฐ์‹œํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด ์–ด๋–ค ์œ ํ˜•์˜ I/O ๋™์ž‘์— "์ค€๋น„" ์ƒํƒœ(๊ฐ€๋ น, ์ž…๋ ฅ ๊ฐ€๋Šฅ)๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น I/O ๋™์ž‘(๊ฐ€๋ น read(2)๋‚˜ ์ถฉ๋ถ„ํžˆ ์ž‘์€ write(2))์„ ๋ธ”๋กํ‚น ์—†์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋ผ๊ณ  ๋ณธ๋‹ค.

select()์—์„œ๋Š” FD_SETSIZE๋ณด๋‹ค ์ž‘์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ๋งŒ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. poll(2)์—๋Š” ๊ทธ๋Ÿฐ ์ œํ•œ์ด ์—†๋‹ค. BUGS ์ฐธ๊ณ .

select()์™€ pselect()์˜ ๋™์ž‘์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ฐจ์ด๋ฅผ ๋นผ๋ฉด ๋™์ผํ•˜๋‹ค.

(i) select()์˜ ํƒ€์ž„์•„์›ƒ์€ struct timeval(์ดˆ์™€ ๋งˆ์ดํฌ๋กœ์ดˆ)์ด์ง€๋งŒ pselect()์—์„œ๋Š” struct timespec(์ดˆ์™€ ๋‚˜๋…ธ์ดˆ)์„ ์“ด๋‹ค.

(ii) select()์—์„œ๋Š” ๋‚จ์€ ์‹œ๊ฐ„์ด ์–ผ๋งˆ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด timeout ์ธ์ž๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. pselect()์—์„œ๋Š” ๊ทธ ์ธ์ž๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.

(iii) select()์—๋Š” sigmask ์ธ์ž๊ฐ€ ์—†๊ณ , ๊ทธ๋ž˜์„œ sigmask๋ฅผ NULL๋กœ ํ•ด์„œ ํ˜ธ์ถœํ•œ pselect()์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

์„ธ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์„ ๊ฐ์‹œํ•œ๋‹ค. readfds์— ๋‚˜์—ด๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์€ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. (๋” ์ •ํ™•ํžˆ๋Š” ์ฝ๊ธฐ๊ฐ€ ๋ธ”๋ก ํ•˜์ง€ ์•Š์„์ง€ ํ™•์ธํ•œ๋‹ค. ํŠนํžˆ ํŒŒ์ผ ๋์—์„œ๋„ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„๋œ ์ƒํƒœ์ด๋‹ค.) writefds์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์€ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. (ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋ฉด ์—ฌ์ „ํžˆ ๋ธ”๋กํ•  ์ˆ˜๋„ ์žˆ๋‹ค.) exceptfds์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์€ ์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์„ ํ™•์ธํ•œ๋‹ค. (์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ poll(2)์˜ POLLPRI ์„ค๋ช…์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.)

๋น ์ ธ ๋‚˜์˜ฌ ๋•Œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ ๊ฐ๊ฐ์€ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ๋ณ€๊ฒฝ๋˜์–ด ์žˆ๋‹ค. (๋”ฐ๋ผ์„œ ๋ฃจํ”„ ์•ˆ์—์„œ select()๋ฅผ ์“ด๋‹ค๋ฉด ํ˜ธ์ถœ ์ „์— ๋งค๋ฒˆ ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.)

ํ•ด๋‹น ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ์‹œํ•  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์„ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ ๊ฐ๊ฐ์„ NULL๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ง‘ํ•ฉ ์กฐ์ž‘์„ ์œ„ํ•œ ๋งคํฌ๋กœ ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. FD_ZERO()๋Š” ์ง‘ํ•ฉ์„ ๋น„์šด๋‹ค. FD_SET()๊ณผ FD_CLR()๋Š” ์ง‘ํ•ฉ์— ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋”ํ•˜๊ณ  ๋บ€๋‹ค. FD_ISSET()์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ง‘ํ•ฉ์— ํฌํ•จ๋ผ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ, select() ๋ฐ˜ํ™˜ ํ›„์— ์“ฐ๊ฒŒ ๋œ๋‹ค.

nfds๋Š” ์„ธ ์ง‘ํ•ฉ์—์„œ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— 1์„ ๋”ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ ์ง‘ํ•ฉ์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ผ ์žˆ๋Š”์ง€๋ฅผ ๊ทธ ์ œํ•œ์น˜๊นŒ์ง€ ํ™•์ธํ•œ๋‹ค. (ํ•˜์ง€๋งŒ BUGS ์ฐธ๊ณ .)

timeout ์ธ์ž๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ select()์—์„œ ๋ธ”๋ก ํ•  ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์Œ ์–ด๋А ๊ฒฝ์šฐ๋“  ํ•ด๋‹นํ•  ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ด ๋ธ”๋ก ํ•˜๊ฒŒ ๋œ๋‹ค.

  • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

  • ํ˜ธ์ถœ์ด ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์ค‘๋‹จ๋œ๋‹ค.

  • ํƒ€์ž„์•„์›ƒ์ด ๋งŒ๋ฃŒ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ timeout ์‹œ๊ฐ„์„ ์‹œ์Šคํ…œ ํด๋Ÿญ ํ•ด์ƒ๋„์— ๋”ฐ๋ผ ์˜ฌ๋ฆผ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ปค๋„ ์Šค์ผ€์ค„๋ง ์ง€์—ฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ธ”๋ก ์‹œ๊ฐ„์„ ์•ฝ๊ฐ„ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค. timeval ๊ตฌ์กฐ์ฒด์˜ ๋‘ ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ 0์ด๋ฉด select()๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ํด๋ง์— ์œ ์šฉํ•˜๋‹ค.) timeout์ด NULL์ด๋ฉด (ํƒ€์ž„์•„์›ƒ์ด ์—†์œผ๋ฉด) select()์—์„œ ๋ฌดํ•œ์ • ๋ธ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

sigmask๋Š” ์‹œ๊ทธ๋„ ๋งˆ์Šคํฌ(sigprocmask(2) ์ฐธ๊ณ )์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋‹ค. NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ pselect()์—์„œ๋Š” ๋จผ์ € ํ˜„์žฌ ์‹œ๊ทธ๋„ ๋งˆ์Šคํฌ๋ฅผ sigmask๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งˆ์Šคํฌ๋กœ ๊ต์ฒดํ•˜๊ณ , "select" ๋™์ž‘์„ ํ•˜๊ณ ์„œ, ์›๋ž˜ ์‹œ๊ทธ๋„ ๋งˆ์Šคํฌ๋ฅผ ๋ณต์›ํ•œ๋‹ค.

timeout ์ธ์ž์˜ ์ •๋ฐ€๋„ ์ฐจ์ด๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋‹ค์Œ pselect() ํ˜ธ์ถœ์€

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

๋‹ค์Œ ํ˜ธ์ถœ๋“ค์„ ์›์ž์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™๋“ฑํ•˜๋‹ค.

sigset_t origmask;

pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);

pselect()๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ์‹œ๊ทธ๋„๊ณผ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ํ•จ๊ป˜ ๊ธฐ๋‹ค๋ฆฌ๋ ค ํ•  ๋•Œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ๋ง‰์œผ๋ ค๋ฉด ์›์ž์  ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ „์—ญ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ ์ „์—ญ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•œ ๋‹ค์Œ์— select() ํ˜ธ์ถœ์„ ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ๊ฒ€์‚ฌ ํ›„์ด์ž ํ˜ธ์ถœ ์ „์— ์‹œ๊ทธ๋„์ด ๋„์ฐฉํ•œ๋‹ค๋ฉด ํ˜ธ์ถœ์ด ๋ฌดํ•œ์ • ๋ฉˆ์ถฐ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฐ˜๋ฉด pselect()๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ๋‹จ ์‹œ๊ทธ๋„๋“ค์„ ๋ง‰์•„ ๋‘๊ณ , ๋“ค์–ด์˜จ ์‹œ๊ทธ๋„๋“ค์„ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ์— ์›ํ•˜๋Š” sigmask๋กœ pselect()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฝ์Ÿ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.)

ํƒ€์ž„์•„์›ƒ

๊ด€๋ จ๋œ ์‹œ๊ฐ„ ๊ตฌ์กฐ์ฒด๋“ค์ด <sys/time.h>์— ์ •์˜๋ผ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์ด๋‹ค.

struct timeval {
    long    tv_sec;         /* ์ดˆ */
    long    tv_usec;        /* ๋งˆ์ดํฌ๋กœ์ดˆ */
};
struct timespec {
    long    tv_sec;         /* ์ดˆ */
    long    tv_nsec;        /* ๋‚˜๋…ธ์ดˆ */
};

(ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ POSIX.1 ๋ฒ„์ „๋“ค ์ฐธ๊ณ .)

์–ด๋–ค ์ฝ”๋“œ์—์„œ๋Š” ์„ธ ์ง‘ํ•ฉ์„ ๋ชจ๋‘ ๋น„์šฐ๊ณ  nfds๋ฅผ 0์œผ๋กœ ํ•˜๊ณ ์„œ NULL ์•„๋‹Œ timeout์„ ์จ์„œ select()๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด๋Š” ์ดˆ ๋‹จ์œ„ ์ดํ•˜ ์ •๋ฐ€๋„๋กœ ์ž ์ž˜ ์ˆ˜ ์žˆ๋Š” ๊ฝค ์ด์‹์„ฑ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์ž ์ž์ง€ ์•Š์€ ์‹œ๊ฐ„์˜ ์–‘์„ ๋ฐ˜์˜ํ•˜๋„๋ก timeout์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„๋“ค์—์„œ๋Š” ๊ทธ๋Ÿฌ์ง€ ์•Š๋Š”๋‹ค. (POSIX.1์—์„œ๋Š” ์–ด๋А ์ชฝ ๋™์ž‘์ด๋“  ํ—ˆ์šฉํ•œ๋‹ค.) ์ด ๋•Œ๋ฌธ์— timeout์„ ์ฝ๋Š” ๋ฆฌ๋ˆ…์Šค ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ๋กœ ์ด์‹ํ•  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋ฃจํ”„์—์„œ struct timeval์„ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  select() ์—ฌ๋Ÿฌ ๋ฒˆ์— ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ˆ…์Šค๋กœ ์ด์‹ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. select() ๋ฐ˜ํ™˜ ํ›„์— timeout์˜ ๊ฐ’์€ ๊ทœ์ •๋ผ ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ select()์™€ pselect()๋Š” ๋ฐ˜ํ™˜๋˜๋Š” ์„ธ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์— ๋‹ด๊ธด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜ ์ˆ˜๋ฅผ (์ฆ‰ readfds, writefds, exceptfds์— ์„ค์ •๋œ ๋น„ํŠธ๋“ค์˜ ์ด๊ฐœ์ˆ˜๋ฅผ) ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „์— ํƒ€์ž„์•„์›ƒ์ด ๋งŒ๋ฃŒ๋œ๋‹ค๋ฉด 0์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก errno๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ทธ ๊ฒฝ์šฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ๋“ค์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ timeout์€ ๊ทœ์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

ERRORS

EBADF
ํ•œ ์ง‘ํ•ฉ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์žˆ๋‹ค. (์•„๋งˆ ์ด๋ฏธ ๋‹ซํ˜”๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์ผ ๊ฒƒ์ด๋‹ค.) ํ•˜์ง€๋งŒ BUGS ์ฐธ๊ณ .
EINTR
์‹œ๊ทธ๋„์„ ์žก์•˜๋‹ค. signal(7) ์ฐธ๊ณ .
EINVAL
nfds๊ฐ€ ์Œ์ˆ˜์ด๊ฑฐ๋‚˜ RLIMIT_NOFILE ์ž์› ์ œํ•œ๊ฐ’(getrlimit(2) ์ฐธ๊ณ )์„ ์ดˆ๊ณผํ•œ๋‹ค.
EINVAL
timeout์— ๋‹ด๊ธด ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.
ENOMEM
๋‚ด๋ถ€ ํ…Œ์ด๋ธ”์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.16์—์„œ pselect()๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๊ทธ ์ „์—๋Š” glibc์—์„œ pselect()๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ ํ–ˆ๋‹ค. (ํ•˜์ง€๋งŒ BUGS ์ฐธ๊ณ .)

CONFORMING TO

select()๋Š” POSIX.1-2001, POSIX.1-2008, 4.4BSD๋ฅผ (4.2BSD์—์„œ select()๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅ) ์ค€์ˆ˜ํ•œ๋‹ค. BSD ์†Œ์ผ“ ๊ณ„์ธต ๋ณต์ œ ํ˜•ํƒœ๋ฅผ ์ง€์›ํ•˜๋Š” BSD ์™ธ ์‹œ์Šคํ…œ๋“ค(์‹œ์Šคํ…œ V ๊ณ„์—ด ํฌํ•จ)๊ณผ์˜ ์‚ฌ์ด์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋กœ ์ด์‹ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ V ๊ณ„์—ด์—์„œ๋Š” ๋ณดํ†ต ๋‚˜์˜ค๊ธฐ ์ „์— ํƒ€์ž„์•„์›ƒ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ˜๋ฉด BSD ๊ณ„์—ด์—์„œ๋Š” ๊ทธ๋Ÿฌ์ง€ ์•Š๋Š”๋‹ค.

pselect()๋Š” POSIX.1g์—, ๊ทธ๋ฆฌ๊ณ  POSIX.1-2001 ๋ฐ POSIX.1-2008์— ๊ทœ์ •๋ผ ์žˆ๋‹ค.

NOTES

fd_set์€ ๊ณ ์ • ํฌ๊ธฐ ๋ฒ„ํผ์ด๋‹ค. ์Œ์ˆ˜์ด๊ฑฐ๋‚˜ FD_SETSIZE์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ํฐ fd ๊ฐ’์œผ๋กœ FD_CLR()์ด๋‚˜ FD_SET()์„ ์‹คํ–‰ํ•  ๋•Œ์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๊ทœ์ •๋ผ ์žˆ์ง€ ์•Š๋‹ค. ๋˜ํ•œ POSIX์—์„œ๋Š” fd๊ฐ€ ์œ ํšจํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•œ๋‹ค.

select() ๋ฐ pselect()์˜ ๋™์ž‘์€ O_NONBLOCK ํ”Œ๋ž˜๊ทธ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ผ๋ถ€ ๋‹ค๋ฅธ ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ๋Š” ์ปค๋„ ๋‚ด๋ถ€ ์ž์›์„ ํ• ๋‹นํ•˜์ง€ ๋ชปํ–ˆ์„ ๋•Œ ๋ฆฌ๋ˆ…์Šค์˜ ENOMEM์ด ์•„๋‹ˆ๋ผ EAGAIN ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค. POSIX์—์„œ poll(2)์— ์ด ์˜ค๋ฅ˜๋ฅผ ๋ช…์„ธํ•˜๊ณ  ์žˆ์ง€๋งŒ select()์— ๋Œ€ํ•ด์„  ์•„๋‹ˆ๋‹ค. ์ด์‹ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” EAGAIN์„ ํ™•์ธํ•ด์„œ EINTR ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ฃจํ”„๋ฅผ ๊ณ„์† ๋„๋Š” ๊ฒŒ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.

pselect()๊ฐ€ ์—†๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” ์ž๊ฐ€ ํŒŒ์ดํ”„ ์š”๋ น์„ ์จ์„œ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ (๊ทธ๋ฆฌ๊ณ  ๋” ์ด์‹์„ฑ ์žˆ๊ฒŒ) ์‹œ๊ทธ๋„ ์žก๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ํŒŒ์ดํ”„๋กœ ํ•œ ๋ฐ”์ดํŠธ๋ฅผ ์จ๋„ฃ๊ณ  ๊ทธ ๋ฐ˜๋Œ€์ชฝ์„ ์ฃผ ํ”„๋กœ๊ทธ๋žจ์˜ select()๋กœ ๊ฐ์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๊ฐ€๋“ ์ฐฌ ํŒŒ์ดํ”„์— ์จ๋„ฃ๊ฑฐ๋‚˜ ๋นˆ ํŒŒ์ดํ”„์—์„œ ์ฝ์„ ๋•Œ ๋ธ”๋ก ๋  ๊ฐ€๋Šฅ์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ดํ”„์— ์ฝ๊ณ  ์“ธ ๋•Œ ๋…ผ๋ธ”๋กœํ‚น I/O๋ฅผ ์“ด๋‹ค.)

์‚ฌ์šฉ ํƒ€์ž…๊ณผ ๊ด€๋ จํ•ด์„œ ์ „ํ†ต์  ํ™˜๊ฒฝ์—์„œ๋Š” timeval ๊ตฌ์กฐ์ฒด์˜ ๋‘ ํ•„๋“œ๊ฐ€ (์œ„์— ๋ณด์ธ ๊ฒƒ์ฒ˜๋Ÿผ) long ํƒ€์ž…์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ทธ ๊ตฌ์กฐ์ฒด๊ฐ€ <sys/time.h>์— ์ •์˜๋ผ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ POSIX.1 ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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 ํ™˜๊ฒฝ์—์„œ๋Š” select()์™€ pselect()๋ฅผ ์œ„ํ•ด <sys/select.h>๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

glibc 2.0 ํ•˜์—์„œ <sys/select.h>์ด ์ œ๊ณตํ•˜๋Š” pselect() ์›ํ˜•์ด ์ž˜๋ชป๋ผ ์žˆ๋‹ค. glibc 2.1์—์„œ 2.2.1๊นŒ์ง€ ํ•˜์—์„  _GNU_SOURCE๊ฐ€ ์ •์˜๋ผ ์žˆ์„ ๋•Œ pselect()๋ฅผ ์ œ๊ณตํ•œ๋‹ค. glibc 2.2.2๋ถ€ํ„ฐ๋Š” ์š”๊ฑด์ด SYNOPSIS์— ๋‚˜์™€ ์žˆ๋Š” ๋Œ€๋กœ์ด๋‹ค.

select()์™€ poll() ์•Œ๋ฆผ์˜ ๋Œ€์‘ ๊ด€๊ณ„

๋ฆฌ๋ˆ…์Šค ์ปค๋„ ์†Œ์Šค์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ์ •์˜๋“ค์ด select()์˜ ์ฝ๊ธฐ ๊ฐ€๋Šฅ, ์“ฐ๊ธฐ ๊ฐ€๋Šฅ, ์˜ˆ์™ธ ์ƒํ™ฉ ์•Œ๋ฆผ๊ณผ poll(2)(๊ณผ epoll(7))์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฒคํŠธ ์•Œ๋ฆผ ์‚ฌ์ด์˜ ๋Œ€์‘ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.

#define POLLIN_SET (POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP |
                    POLLERR)
                   /* ์ฝ๊ธฐ ์ค€๋น„๋จ */
#define POLLOUT_SET (POLLWRBAND | POLLWRNORM | POLLOUT | POLLERR)
                   /* ์“ฐ๊ธฐ ์ค€๋น„๋จ */
#define POLLEX_SET (POLLPRI)
                   /* ์˜ˆ์™ธ ์ƒํ™ฉ */

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์‘์šฉ

select()๋กœ ๊ฐ์‹œ ์ค‘์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ซ๋Š” ๊ฒฝ์šฐ์˜ ๊ฒฐ๊ณผ๋Š” ๋ช…์„ธ๋ผ ์žˆ์ง€ ์•Š๋‹ค. ์–ด๋–ค ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ๋Š” select()๊ฐ€ ๋ธ”๋ก์„ ๋ฉˆ์ถ”๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๊ทธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋ผ๊ณ  ํ‘œ์‹œํ•œ๋‹ค. (๊ทธ๋Ÿฌ๋ฉด ์ด์–ด์ง€๋Š” I/O ๋™์ž‘์ด ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹จ select() ๋ฐ˜ํ™˜ ์‹œ์ ๊ณผ I/O ๋™์ž‘ ์ˆ˜ํ–‰ ์‹œ์  ์‚ฌ์ด์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ทธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ค์‹œ ์—ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.) ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” (๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š”) ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ซ๋Š” ๊ฒŒ select()์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์š”์ปจ๋ฐ ์ด ์ƒํ™ฉ์—์„œ ํŠน์ • ๋™์ž‘ ๋ฐฉ์‹์— ์˜์กดํ•˜๋Š” ์‘์šฉ์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ด์•ผ ํ•œ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ๋Š” ์ž„์˜ ํฌ๊ธฐ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  nfds์˜ ๊ฐ’์œผ๋กœ ๊ฒ€์‚ฌํ•  ์ง‘ํ•ฉ์˜ ๊ธธ์ด๋ฅผ ์•Œ์•„๋‚ธ๋‹ค. ํ•˜์ง€๋งŒ glibc ๊ตฌํ˜„์—์„œ๋Š” fd_set ํƒ€์ž…์˜ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋ผ ์žˆ๋‹ค. BUGS๋„ ์ฐธ๊ณ .

์ด ํŽ˜์ด์ง€์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” pselect() ์ธํ„ฐํŽ˜์ด์Šค๋Š” glibc์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์ด๋ฆ„์€ pselect6()์ด๋‹ค. ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ glibc ๋ž˜ํผ ํ•จ์ˆ˜์™€ ๋™์ž‘ ๋ฐฉ์‹์ด ์ข€ ๋‹ค๋ฅด๋‹ค.

๋ฆฌ๋ˆ…์Šค์˜ pselect6() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ๋Š” timeout ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ํ•˜์ง€๋งŒ glibc ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ ํƒ€์ž„์•„์›ƒ ์ธ์ž์— ๋Œ€ํ•œ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์“ฐ๊ณ  ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ทธ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ์ถ˜๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ glibc์˜ pselect() ํ•จ์ˆ˜๋Š” timeout ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” POSIX.1-2001์—์„œ ์š”๊ตฌํ•˜๋Š” ๋™์ž‘ ๋ฐฉ์‹์ด๋‹ค.

pselect6() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” sigset_t * ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์ฒด์ด๋‹ค.

struct {
    const kernel_sigset_t *ss;   /* ์‹œ๊ทธ๋„ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ */
    size_t ss_len;               /* 'ss'๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์˜ ํฌ๊ธฐ
                                    (๋ฐ”์ดํŠธ ๋‹จ์œ„) */
};

๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ตœ๋Œ€ 6๊ฐœ ์ธ์ž๋งŒ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ ์‹œ๊ทธ๋„ ์ง‘ํ•ฉ ํฌ์ธํ„ฐ์™€ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ปค๋„๊ณผ libc์—์„œ์˜ ์‹œ๊ทธ๋„ ์ง‘ํ•ฉ ๊ฐœ๋… ์ฐจ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ sigprocmask(2)๋ฅผ ๋ณด๋ผ.

BUGS

POSIX์—์„œ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜ ๋ฒ”์œ„์— ๋Œ€ํ•ด ๊ตฌํ˜„์—์„œ ์ƒํ•œ์„ ์ •ํ•ด์„œ ์ƒ์ˆ˜ FD_SETSIZE๋ฅผ ํ†ตํ•ด ์•Œ๋ฆฌ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ๋Š” ์–ด๋–ค ๊ณ ์ • ์ œํ•œ๋„ ๋‘์ง€ ์•Š์ง€๋งŒ glibc ๊ตฌํ˜„์—์„œ๋Š” FD_SETSIZE๋ฅผ 1024๋กœ ํ•ด์„œ fd_set์„ ๊ณ ์ • ํฌ๊ธฐ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ณ  FD_*() ๋งคํฌ๋กœ๊ฐ€ ๊ทธ ์ œํ•œ์— ๋”ฐ๋ผ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค. 1023๋ณด๋‹ค ํฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ฐ์‹œํ•˜๋ ค๋ฉด poll(2)์„ ์จ์•ผ ํ•œ๋‹ค.

fd_set ์ธ์ž๊ฐ€ ๊ฐ’-๊ฒฐ๊ณผ ์ธ์ž๋กœ ๊ตฌํ˜„๋ผ ์žˆ์œผ๋ฏ€๋กœ select()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์„ค์ •ํ•ด ์ค˜์•ผ ํ•œ๋‹ค. poll(2)์—์„œ๋Š” ํ˜ธ์ถœ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์— ๋ณ„๋„์˜ ๊ตฌ์กฐ์ฒด ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด ์„ค๊ณ„ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•œ๋‹ค.

POSIX์— ๋”ฐ๋ฅด๋ฉด select()์—์„œ๋Š” ์„ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์— ์ง€์ •๋œ ๋ชจ๋“  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ์ƒํ•œ nfds-1๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜„์žฌ ์—ด์–ด ๋‘” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ์˜ ์ตœ๋Œ“๊ฐ’๋ณด๋‹ค ํฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค. POSIX์— ๋”ฐ๋ฅด๋ฉด ํ•œ ์ง‘ํ•ฉ์— ๊ทธ๋Ÿฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ง€์ •๋ผ ์žˆ์œผ๋ฉด EBADF ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค.

glibc 2.0์—์„œ๋Š” sigmask ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” pselect() ๋ฒ„์ „์„ ์ œ๊ณตํ–ˆ๋‹ค.

glibc ๋ฒ„์ „ 2.1๋ถ€ํ„ฐ sigprocmask(2)์™€ select()๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•œ pselect() ์—๋ฎฌ๋ ˆ์ด์…˜์„ ์ œ๊ณตํ–ˆ๋‹ค. ๊ทธ ๊ตฌํ˜„์€ pselect()๊ฐ€ ๋ฐฉ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋ฐ”๋กœ ๊ทธ ๊ฒฝ์Ÿ ์กฐ๊ฑด์— ์—ฌ์ „ํžˆ ์ทจ์•ฝํ–ˆ๋‹ค. ์ตœ๊ทผ์˜ glibc ๋ฒ„์ „๋“ค์—์„œ๋Š” ์ปค๋„์—์„œ (๊ฒฝ์Ÿ ์—†๋Š”) pselect() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ œ๊ณตํ•˜๋ฉด ๊ทธ๊ฑธ ์“ด๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” select()์—์„œ ์–ด๋–ค ์†Œ์ผ“ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ "์ฝ๊ธฐ ์ค€๋น„๋จ"์œผ๋กœ ๋ณด๊ณ ํ–ˆ๋Š”๋ฐ ์ด์–ด์ง€๋Š” ์ฝ๊ธฐ๊ฐ€ ๋ธ”๋ก ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ–ˆ์ง€๋งŒ ์กฐ์‚ฌํ•ด ๋ณด๋‹ˆ ์ฒดํฌ์„ฌ์ด ํ‹€๋ ค์„œ ํ๊ธฐํ•  ๋•Œ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋ผ๊ณ  ์ž˜๋ชป ๋ณด๊ณ ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธ”๋ก ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์†Œ์ผ“์—์„œ๋Š” O_NONBLOCK์„ ์“ฐ๋Š” ๊ฒŒ ์•ˆ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ํ˜ธ์ถœ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ(์ฆ‰ EINTR ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜)์—๋„ select()์—์„œ timeout์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ด๋Š” POSIX.1์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋™์ž‘์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค์˜ pselect() ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ glibc ๋ž˜ํผ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ timeout์„ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋ณต์‚ฌํ•˜๊ณ  ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ „๋‹ฌํ•จ์œผ๋กœ์จ ๊ทธ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ์ถ˜๋‹ค.

EXAMPLE

#include <stdio.h>
#include <stdlib.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("Data is available now.\n");
        /* FD_ISSET(0, &rfds)๊ฐ€ ์ฐธ์ž„. */
    else
        printf("No data within five seconds.\n");

    exit(EXIT_SUCCESS);
}

SEE ALSO

accept(2), connect(2), poll(2), read(2), recv(2), restart_syscall(2), send(2), sigprocmask(2), write(2), epoll(7), time(7)

์„ค๋ช…๊ณผ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋Š” ์ž์Šต์„œ์ธ select_tut(2) ์ฐธ๊ณ .


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ