poll(2) - wariua/manpages-ko GitHub Wiki
poll, ppoll - ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ด๋ค ์ด๋ฒคํธ ๊ธฐ๋ค๋ฆฌ๊ธฐ
#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);
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
๋ ์์ง๋ง ์ฐ์ง๋ ์๋๋ค.
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()
์์ ๋ฌดํ์ ๋ธ๋ก ํ ์ ์๋ค.
์ฑ๊ณต ์ ์์๋ฅผ ๋ฐํํ๋ค. ์ด๋ revents
ํ๋๊ฐ 0์ด ์๋ ๊ตฌ์กฐ์ฒด๋ค์ (๋ฌ๋ฆฌ ๋งํด ์ด๋ฒคํธ๋ ์ค๋ฅ๊ฐ ๋ณด๊ณ ๋ ๋์คํฌ๋ฆฝํฐ๋ค์) ์์ด๋ค. 0 ๊ฐ์ ํธ์ถ์ด ํ์์์ ๋์๊ณ ์ด๋ค ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ์ค๋น ์ํ๊ฐ ์๋์์์ ๋ํ๋ธ๋ค. ์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
EFAULT
- ์ธ์๋ก ์ค ๋ฐฐ์ด์ด ํธ์ถ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ๊ณต๊ฐ์ ๋ค์ด ์์ง ์๋ค.
EINTR
- ์์ฒญํ ์ด๋ฒคํธ๋ค์ ์์ ์๊ทธ๋์ด ๋ฐ์ํ๋ค. signal(7) ์ฐธ๊ณ .
EINVAL
-
nfds
๊ฐ์ดRLIMIT_NOFILE
๊ฐ์ ์ด๊ณผํ๋ค. EINVAL
- (
ppoll()
)*ip
์ ์๋ ํ์์์ ๊ฐ์ด ์ ํจํ์ง ์๋ค (์์๋ค). ENOMEM
- ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์ ํ ๋นํ ๊ณต๊ฐ์ด ์๋ค.
๋ฆฌ๋
์ค 2.1.23์์ poll()
์์คํ
ํธ์ถ์ด ๋์
๋์๋ค. ์ด ์์คํ
ํธ์ถ์ด ์๋ ๋ ์ ์ปค๋์์๋ glibc์ (๊ทธ๋ฆฌ๊ณ ๊ตฌ์ ๋ฆฌ๋
์ค libc์) poll()
๋ํผ ํจ์์์ select(2)๋ฅผ ์จ์ ์๋ฎฌ๋ ์ด์
์ ์ ๊ณตํ๋ค.
๋ฆฌ๋
์ค ์ปค๋ 2.6.16์์ ppoll()
์์คํ
ํธ์ถ์ด ์ถ๊ฐ๋์๋ค. glibc 2.4์์ ppoll()
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ์ด ์ถ๊ฐ๋์๋ค.
poll()
์ POSIX.1-2001 ๋ฐ POSIX.1-2008์ ์ค์ํ๋ค. ppoll()
์ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ค.
poll()
๋ฐ ppoll()
์ ๋์์ O_NONBLOCK
ํ๋๊ทธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ผ๋ถ ๋ค๋ฅธ ์ ๋์ค ์์คํ
์์๋ ์ปค๋ ๋ด๋ถ ์์์ ํ ๋นํ์ง ๋ชปํ์ ๋ ๋ฆฌ๋
์ค์ ENOMEM
์ด ์๋๋ผ EAGAIN
์ค๋ฅ๋ก ์คํจํ ์ ์๋ค. POSIX์์ ๊ทธ๋ฐ ๋์์ ํ์ฉํ๋ค. ์ด์ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์์๋ EAGAIN
์ ํ์ธํด์ EINTR
๊ฒฝ์ฐ์ฒ๋ผ ๋ฃจํ๋ฅผ ๊ณ์ ๋๋ ๊ฒ ์ข์ ์ ์๋ค.
์ด๋ค ๊ตฌํ๋ค์์๋ poll()
์์ timeout
์ ์ธ ์ ์๋ ๋นํ์ค ์์ INFTIM
์ -1 ๊ฐ์ผ๋ก ์ ์ํ๊ณ ์๋ค. glibc์์๋ ์ด ์์๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
poll()
๋ก ๊ฐ์ ์ค์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์์ ๋ซ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ์ ์๋์ง์ ๋ํ ๋
ผ์๋ select(2)๋ฅผ ๋ณด๋ผ.
๋ฆฌ๋
์ค์ ppoll()
์์คํ
ํธ์ถ์์๋ tmo_p
์ธ์๋ฅผ ๋ณ๊ฒฝํ๋ค. ํ์ง๋ง glibc ๋ํผ ํจ์์์ ํ์์์ ์ธ์์ ๋ํ ์ง์ญ ๋ณ์๋ฅผ ์ฐ๊ณ ๊ทธ ๋ณ์๋ฅผ ์์คํ
ํธ์ถ๋ก ์ ๋ฌํ์ฌ ๊ทธ ๋์ ๋ฐฉ์์ ๊ฐ์ถ๋ค. ๊ทธ๋ฆฌํ์ฌ glibc์ ppoll()
ํจ์๋ tmo_p
์ธ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์ง์ง ppoll()
์์คํ
ํธ์ถ์๋ ๋ค์ฏ ๋ฒ์งธ ์ธ์ size_t sigsetsize
๊ฐ ์๋๋ฐ, ์ด๋ sigmask
์ธ์์ ๋ฐ์ดํธ ๋จ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค. glibc์ ppoll()
๋ํผ ํจ์์์ ์ด ์ธ์๋ฅผ ๊ณ ์ ๋ ๊ฐ(sizeof(kernel_sigset_t)
)์ผ๋ก ์ง์ ํ๋ค. ์ปค๋๊ณผ libc์์์ ์๊ทธ๋ ์งํฉ ๊ฐ๋
์ฐจ์ด์ ๋ํ ์ค๋ช
์ sigprocmask(2)๋ฅผ ๋ณด๋ผ.
select(2)์ BUGS ์ ์ ์๋ ์ค๋น ์ํ ๊ฑฐ์ง ์๋ฆผ ๋ ผ์๋ฅผ ๋ณด๋ผ.
restart_syscall(2), select(2), select_tut(2), epoll(7), time(7)
2019-08-02