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

NAME

poll, ppoll - ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

SYNOPSIS

#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define _GNU_SOURCE         /* feature_test_macros(7) ์ฐธ๊ณ  */
#include <signal.h>
#include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds,
        const struct timespec *tmo_p, const sigset_t *sigmask);

DESCRIPTION

poll()์€ select(2)์™€ ๋น„์Šทํ•œ ์ž‘์—…์„ ํ•œ๋‹ค. ์ฆ‰ ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ผ๋„ I/O๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๊ฐ์‹œํ•  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์„ fds ์ธ์ž์—์„œ ์ง€์ •ํ•˜๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด์˜ ๋ฐฐ์—ด์ด๋‹ค.

struct pollfd {
    int   fd;         /* ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ */
    short events;     /* ์š”์ฒญํ•œ ์ด๋ฒคํŠธ */
    short revents;    /* ๋ฐ˜ํ™˜๋œ ์ด๋ฒคํŠธ */
};

fds์˜ ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๋ฅผ ํ˜ธ์ถœ์ž๊ฐ€ nfds์— ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

fd ํ•„๋“œ๋Š” ์—ด๋ฆฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ด๋Š”๋‹ค. ์ด ํ•„๋“œ๊ฐ€ ์Œ์ˆ˜์ด๋ฉด ๋Œ€์‘ํ•˜๋Š” events ํ•„๋“œ๋ฅผ ๋ฌด์‹œํ•˜๋ฉฐ revents ํ•„๋“œ์— 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์ด ์ ์„ ์ด์šฉํ•˜๋ฉด ์–ด๋–ค ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ poll() ํ˜ธ์ถœ ํ•œ ๋ฒˆ ๋™์•ˆ๋งŒ ๋ฌด์‹œํ•˜๋Š” ๊ฑธ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค. fd ํ•„๋“œ ๋ถ€ํ˜ธ๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ 0์€ ์ด ๊ธฐ๋ฒ•์œผ๋กœ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค.)

events ํ•„๋“œ๋Š” ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ fd์— ๋Œ€ํ•ด ์‘์šฉ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์ด๋ฒคํŠธ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋น„ํŠธ ๋งˆ์Šคํฌ์ด๋‹ค. ์ด ํ•„๋“œ๋ฅผ 0์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฒฝ์šฐ revents๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์ด๋ฒคํŠธ๋Š” POLLHUP, POLLERR, POLLNVAL๋ฟ์ด๋‹ค. (์•„๋ž˜ ์ฐธ๊ณ .)

revents ํ•„๋“œ๋Š” ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ ์‹ค์ œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋“ค์„ ์ปค๋„์—์„œ ์ฑ„์šด๋‹ค. revents๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๋น„ํŠธ๋“ค์—๋Š” events์— ์ง€์ •ํ•œ ๋น„ํŠธ๋“ค์ด, ๊ทธ๋ฆฌ๊ณ  ๊ฐ’ POLLERR, POLLHUP, POLLNVAL ์ค‘ ํ•˜๋‚˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. (์ด ์„ธ ๋น„ํŠธ๋Š” events ํ•„๋“œ์—์„œ๋Š” ๋ฌด์˜๋ฏธํ•˜๋ฉฐ ํ•ด๋‹น ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด revents ํ•„๋“œ์— ์„ค์ •๋œ๋‹ค.)

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ชจ๋‘์—์„œ ์š”์ฒญ ์ด๋ฒคํŠธ ์–ด๋А ๊ฒƒ๋„ (๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์˜ค๋ฅ˜๋„) ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ๊ทธ ์ด๋ฒคํŠธ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๊นŒ์ง€ poll()์ด ๋ธ”๋ก ํ•œ๋‹ค.

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

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

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

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

์ฐธ๊ณ ๋กœ timeout ์‹œ๊ฐ„์„ ์‹œ์Šคํ…œ ํด๋Ÿญ ํ•ด์ƒ๋„์— ๋”ฐ๋ผ ์˜ฌ๋ฆผ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ปค๋„ ์Šค์ผ€์ค„๋ง ์ง€์—ฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ธ”๋ก ์‹œ๊ฐ„์„ ์•ฝ๊ฐ„ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค. timeout์— ์Œ์ˆ˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฑด ๋ฌดํ•œ ํƒ€์ž„์•„์›ƒ์„ ๋œปํ•œ๋‹ค. timeout์„ 0์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ค€๋น„ ์ƒํƒœ์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ poll()์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

events์— ์„ค์ •ํ•˜๊ณ  revents๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ๋“ค์ด <poll.h>์— ์ •์˜๋ผ ์žˆ๋‹ค.

POLLIN
์ฝ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค.
POLLPRI

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ์–ด๋–ค ์˜ˆ์™ธ ์ƒํ™ฉ์ด ์žˆ๋‹ค. ๋‹ค์Œ ๊ฒฝ์šฐ๋“ค ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • TCP ์†Œ์ผ“์— ๋Œ€์—ญ์™ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค. (tcp(7) ์ฐธ๊ณ .)

  • ํŒจํ‚ท ๋ชจ๋“œ์ธ ์œ ์‚ฌ ํ„ฐ๋ฏธ๋„ ๋งˆ์Šคํ„ฐ๊ฐ€ ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋ณด์•˜๋‹ค. (ioctl_tty(2) ์ฐธ๊ณ .)

  • cgroup.events ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. (cgroups(7) ์ฐธ๊ณ .)

POLLOUT
ํ˜„์žฌ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ์†Œ์ผ“ ๋‚ด์ง€ ํŒŒ์ดํ”„์˜ ๊ฐ€์šฉ ๊ณต๊ฐ„๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์จ๋„ฃ์œผ๋ฉด (O_NONBLOCK์ด ์„ค์ •๋ผ ์žˆ์ง€ ์•Š์œผ๋ฉด) ์—ฌ์ „ํžˆ ๋ธ”๋ก ๋œ๋‹ค.
POLLRDHUP (๋ฆฌ๋ˆ…์Šค 2.6.17๋ถ€ํ„ฐ)
์ŠคํŠธ๋ฆผ ์†Œ์ผ“์˜ ์ƒ๋Œ€๊ฐ€ ์—ฐ๊ฒฐ์„ ๋‹ซ์•˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์˜ ์“ฐ๊ธฐ ์ชฝ์„ ๋‹ซ์•˜๋‹ค. ์ด ๋น„ํŠธ ์ •์˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด (์–ด๋–ค ํ—ค๋” ํŒŒ์ผ๋„ ํฌํ•จ์‹œํ‚ค๊ธฐ ์ „์—) ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ _GNU_SOURCE๊ฐ€ ์ •์˜๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
POLLERR
์˜ค๋ฅ˜ ์ƒํ™ฉ. (revents๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ๋งŒ ํ•˜๊ณ  events์—์„œ๋Š” ๋ฌด์‹œ.) ํŒŒ์ดํ”„์˜ ์“ฐ๊ธฐ ์ชฝ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋Œ€ํ•ด์„œ ์ฝ๊ธฐ ์ชฝ์ด ๋‹ซํ˜”์„ ๋•Œ๋„ ์ด ๋น„ํŠธ๊ฐ€ ์„ค์ •๋œ๋‹ค.
POLLHUP
์—ฐ๊ฒฐ ๋Š๊ฒผ์Œ. (revents๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ๋งŒ ํ•˜๊ณ  events์—์„œ๋Š” ๋ฌด์‹œ.) ์ฐธ๊ณ ๋กœ ํŒŒ์ดํ”„๋‚˜ ์ŠคํŠธ๋ฆผ ์†Œ์ผ“ ๊ฐ™์€ ์ฑ„๋„์—์„œ ์ฝ๊ธฐ๋ฅผ ํ•  ๋•Œ ์ด ์ด๋ฒคํŠธ๋Š” ์ƒ๋Œ€๊ฐ€ ์ฑ„๋„์˜ ๊ทธ์ชฝ ๋์„ ๋‹ซ์•˜๋‹ค๋Š” ํ‘œ์‹œ์ผ ๋ฟ์ด๋‹ค. ๊ทธ ์ฑ„๋„์˜ ๋ฏธ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์†Œ๋น„ํ•œ ํ›„์—์•ผ ์ฑ„๋„ ์ฝ๊ธฐ๊ฐ€ 0(ํŒŒ์ผ ๋)์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
POLLNVAL
์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ฒญ: fd๊ฐ€ ์—ด๋ ค ์žˆ์ง€ ์•Š์Œ. (revents๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ๋งŒ ํ•˜๊ณ  events์—์„œ๋Š” ๋ฌด์‹œ.)

_XOPEN_SOURCE๊ฐ€ ์ •์˜๋œ ์ฑ„๋กœ ์ปดํŒŒ์ผ ํ•˜๋ฉด ๋‹ค์Œ ๋น„ํŠธ๋“ค๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๋ฐ, ์œ„์— ๋‚˜์—ดํ•œ ๋น„ํŠธ๋“ค ์ด์ƒ์˜ ์ •๋ณด๋ฅผ ์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค.

POLLRDNORM
POLLIN๊ณผ ๋™๋“ฑํ•˜๋‹ค.
POLLRDBAND
์šฐ์„  ๋Œ€์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. (๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๋ณดํ†ต ์“ฐ์ง€ ์•Š์Œ.)
POLLWRNORM
POLLOUT๊ณผ ๋™๋“ฑํ•˜๋‹ค.
POLLWRBAND
์šฐ์„  ๋Œ€์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—๋Š” POLLMSG๋„ ์žˆ์ง€๋งŒ ์“ฐ์ง€๋Š” ์•Š๋Š”๋‹ค.

ppoll()

poll()๊ณผ ppoll()์˜ ๊ด€๊ณ„๋Š” select(2)์™€ pselect(2)์˜ ๊ด€๊ณ„์™€ ๋น„์Šทํ•˜๋‹ค. pselect(2)์ฒ˜๋Ÿผ ์‘์šฉ์—์„œ ppoll()์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋˜๊ฑฐ๋‚˜ ์‹œ๊ทธ๋„์„ ์žก์„ ๋•Œ๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

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

ready = ppoll(&fds, nfds, tmo_p, &sigmask);

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

sigset_t origmask;
int timeout;

timeout = (tmo_p == NULL) ? -1 :
          (tmo_p->tv_sec * 1000 + tmo_p->tv_nsec / 1000000);
pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = poll(&fds, nfds, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);

์œ„ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™๋“ฑํ•˜๋‹ค๊ณ  ํ•œ ์ด์œ ๋Š” poll()์—์„  ์Œ์ˆ˜ timeout ๊ฐ’์„ ๋ฌดํ•œ๋Œ€ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ํ•ด์„ํ•˜์ง€๋งŒ ppoll()์—์„  *tmo_p์˜ ๊ฐ’์ด ์Œ์ˆ˜์ด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ppoll()์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” pselect(2)์˜ ์„ค๋ช…์„ ๋ณด๋ผ.

sigmask๋ฅผ NULL๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‹œ๊ทธ๋„ ๋งˆ์Šคํฌ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ทธ๋Ÿฌ๋ฉด ppoll()๊ณผ poll()์˜ ์ฐจ์ด๋Š” timeout ์ธ์ž์˜ ์ •๋ฐ€๋„๋ฟ์ด๋‹ค.)

tmo_p ์ธ์ž๋Š” ppoll()์—์„œ ๋ธ”๋ก ํ•  ์‹œ๊ฐ„์˜ ์ƒํ•œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ์ธ์ž๋Š” ๋‹ค์Œ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๋‹ค.

struct timespec {
    long    tv_sec;         /* ์ดˆ */
    long    tv_nsec;        /* ๋‚˜๋…ธ์ดˆ */
};

tmo_p๋ฅผ NULL๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ppoll()์—์„œ ๋ฌดํ•œ์ • ๋ธ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ ์–‘์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” revents ํ•„๋“œ๊ฐ€ 0์ด ์•„๋‹Œ ๊ตฌ์กฐ์ฒด๋“ค์˜ (๋‹ฌ๋ฆฌ ๋งํ•ด ์ด๋ฒคํŠธ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋œ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜) ์ˆ˜์ด๋‹ค. 0 ๊ฐ’์€ ํ˜ธ์ถœ์ด ํƒ€์ž„์•„์›ƒ ๋˜์—ˆ๊ณ  ์–ด๋–ค ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋„ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EFAULT
์ธ์ž๋กœ ์ค€ ๋ฐฐ์—ด์ด ํ˜ธ์ถœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋“ค์–ด ์žˆ์ง€ ์•Š๋‹ค.
EINTR
์š”์ฒญํ•œ ์ด๋ฒคํŠธ๋“ค์— ์•ž์„œ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ–ˆ๋‹ค. signal(7) ์ฐธ๊ณ .
EINVAL
nfds ๊ฐ’์ด RLIMIT_NOFILE ๊ฐ’์„ ์ดˆ๊ณผํ•œ๋‹ค.
EINVAL
(ppoll()) *ip์— ์žˆ๋Š” ํƒ€์ž„์•„์›ƒ ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค (์Œ์ˆ˜๋‹ค).
ENOMEM
ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ…Œ์ด๋ธ”์„ ํ• ๋‹นํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.1.23์—์„œ poll() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋„์ž…๋˜์—ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์—†๋Š” ๋” ์ „ ์ปค๋„์—์„œ๋Š” glibc์˜ (๊ทธ๋ฆฌ๊ณ  ๊ตฌ์‹ ๋ฆฌ๋ˆ…์Šค libc์˜) poll() ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ select(2)๋ฅผ ์จ์„œ ์—๋ฎฌ๋ ˆ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.16์—์„œ ppoll() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. glibc 2.4์—์„œ ppoll() ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

poll()์€ POSIX.1-2001 ๋ฐ POSIX.1-2008์„ ์ค€์ˆ˜ํ•œ๋‹ค. ppoll()์€ ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

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

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

์–ด๋–ค ๊ตฌํ˜„๋“ค์—์„œ๋Š” poll()์—์„œ timeout์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๋น„ํ‘œ์ค€ ์ƒ์ˆ˜ INFTIM์„ -1 ๊ฐ’์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. glibc์—์„œ๋Š” ์ด ์ƒ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

poll()๋กœ ๊ฐ์‹œ ์ค‘์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ซ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” select(2)๋ฅผ ๋ณด๋ผ.

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

๋ฆฌ๋ˆ…์Šค์˜ ppoll() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ๋Š” tmo_p ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ํ•˜์ง€๋งŒ glibc ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ ํƒ€์ž„์•„์›ƒ ์ธ์ž์— ๋Œ€ํ•œ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์“ฐ๊ณ  ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ทธ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ์ถ˜๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ glibc์˜ ppoll() ํ•จ์ˆ˜๋Š” tmo_p ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ง„์งœ ppoll() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—๋Š” ๋‹ค์„ฏ ๋ฒˆ์งธ ์ธ์ž size_t sigsetsize๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” sigmask ์ธ์ž์˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. glibc์˜ ppoll() ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ ์ด ์ธ์ž๋ฅผ ๊ณ ์ •๋œ ๊ฐ’(sizeof(kernel_sigset_t))์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. ์ปค๋„๊ณผ libc์—์„œ์˜ ์‹œ๊ทธ๋„ ์ง‘ํ•ฉ ๊ฐœ๋… ์ฐจ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ sigprocmask(2)๋ฅผ ๋ณด๋ผ.

BUGS

select(2)์˜ BUGS ์ ˆ์— ์žˆ๋Š” ์ค€๋น„ ์ƒํƒœ ๊ฑฐ์ง“ ์•Œ๋ฆผ ๋…ผ์˜๋ฅผ ๋ณด๋ผ.

SEE ALSO

restart_syscall(2), select(2), select_tut(2), epoll(7), time(7)


2019-08-02

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