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

NAME

epoll_wait, epoll_pwait - epoll 파일 λ””μŠ€ν¬λ¦½ν„°μ—μ„œ I/O 이벀트 기닀리기

SYNOPSIS

#include <sys/epoll.h>

int epoll_wait(int epfd, struct epoll_event *events,
               int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
               int maxevents, int timeout,
               const sigset_t *sigmask);

DESCRIPTION

epoll_wait() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ 파일 λ””μŠ€ν¬λ¦½ν„° epfdκ°€ κ°€λ¦¬ν‚€λŠ” epoll(7) μΈμŠ€ν„΄μŠ€μ—μ„œ 이벀트λ₯Ό κΈ°λ‹€λ¦°λ‹€. eventsκ°€ κ°€λ¦¬ν‚€λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ΄λ²€νŠΈλ“€μ΄ λ‹΄κΈ°κ²Œ λ˜μ–΄ ν˜ΈμΆœμžκ°€ μ΄μš©ν•  수 μžˆλ‹€. μ΅œλŒ€ maxevents 개 이벀트λ₯Ό λ°˜ν™˜ν•œλ‹€. maxevents μΈμžλŠ” 0보닀 컀야 ν•œλ‹€.

timeout μΈμžλŠ” epoll_wait()μ—μ„œ 블둝 ν•  λ°€λ¦¬μ΄ˆ 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. CLOCK_MONOTONIC 클럭으둜 μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€. λ‹€μŒ μ–΄λŠ κ²½μš°λ“  ν•΄λ‹Ήν•  λ•ŒκΉŒμ§€ 호좜이 블둝 ν•˜κ²Œ λœλ‹€.

  • 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ 이벀트λ₯Ό λ‚΄λ†“λŠ”λ‹€.

  • 호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λœλ‹€.

  • νƒ€μž„μ•„μ›ƒμ΄ λ§Œλ£Œλœλ‹€.

참고둜 timeout μ‹œκ°„μ„ μ‹œμŠ€ν…œ 클럭 해상도에 따라 올림 ν•˜κ²Œ 되며 컀널 μŠ€μΌ€μ€„λ§ 지연도 있기 λ•Œλ¬Έμ— κ·Έ 블둝 μ‹œκ°„μ„ μ•½κ°„ λ„˜κΈΈ μˆ˜λ„ μžˆλ‹€. timeout을 -1둜 μ§€μ •ν•˜λ©΄ epoll_wait()이 λ¬΄ν•œμ • 블둝 ν•˜κ²Œ 되며, timeout을 0으둜 μ§€μ •ν•˜λ©΄ κ°€μš© μ΄λ²€νŠΈκ°€ 없더라도 epoll_wait()이 μ¦‰μ‹œ λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

struct epoll_eventλŠ” λ‹€μŒμœΌλ‘œ μ •μ˜λΌ μžˆλ‹€.

typedef union epoll_data {
    void        *ptr;
    int          fd;
    uint32_t     u32;
    uint64_t     u64;
} epoll_data_t;

struct epoll_event {
    uint32_t     events;      /* epoll 이벀트 */
    epoll_data_t data;        /* μ‚¬μš©μž 데이터 λ³€μˆ˜ */
};

λ°˜ν™˜λœ ꡬ쑰체 각각의 data ν•„λ“œμ—λŠ” ν•΄λ‹Ή μ—΄λ¦° 파일 기술 ν•­λͺ©μ— λŒ€ν•΄ κ°€μž₯ 졜근 epoll_ctl(2)(EPOLL_CTL_ADD, EPOLL_CTL_MOD)μ—μ„œ μ§€μ •ν•œ 것과 λ™μΌν•œ 데이터가 담겨 μžˆλ‹€. events ν•„λ“œλŠ” λ°˜ν™˜λœ 이벀트 λΉ„νŠΈ ν•„λ“œλ₯Ό λ‹΄λŠ”λ‹€.

epoll_pwait()

epoll_wait()κ³Ό epoll_pwait()의 κ΄€κ³„λŠ” select(2)와 pselect(2)의 관계와 λΉ„μŠ·ν•˜λ‹€. pselect(2)처럼 μ‘μš©μ—μ„œ epoll_pwait()을 μ‚¬μš©ν•΄ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ€€λΉ„ μƒνƒœκ°€ λ˜κ±°λ‚˜ μ‹œκ·Έλ„μ„ μž‘μ„ λ•ŒκΉŒμ§€ μ•ˆμ „ν•˜κ²Œ λŒ€κΈ°ν•  수 μžˆλ‹€.

λ‹€μŒ epoll_pwait() ν˜ΈμΆœμ€

ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask);

λ‹€μŒ ν˜ΈμΆœλ“€μ„ μ›μžμ μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” 것과 λ™λ“±ν•˜λ‹€.

sigset_t origmask;

pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = epoll_wait(epfd, &events, maxevents, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);

sigmask 인자λ₯Ό NULL둜 μ§€μ •ν•  수 있으며, κ·Έ 경우 epoll_pwait()은 epoll_wait()κ³Ό λ™λ“±ν•˜λ‹€.

RETURN VALUE

성곡 μ‹œ epoll_wait()은 μš”μ²­ I/O에 μ€€λΉ„λœ 파일 λ””μŠ€ν¬λ¦½ν„° 수λ₯Ό λ°˜ν™˜ν•˜λ©°, μ§€μ •ν•œ timeout λ°€λ¦¬μ΄ˆ λ™μ•ˆ μ€€λΉ„ μƒνƒœκ°€ 된 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ—†μœΌλ©΄ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ λ°œμƒ μ‹œ epoll_wait()은 -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

EBADF
epfdκ°€ μœ μš”ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆλ‹€.
EFAULT
eventsκ°€ κ°€λ¦¬ν‚€λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ μ“°κΈ° κΆŒν•œμœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€.
EINTR
(1) μš”μ²­ν•œ ν•œ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ±°λ‚˜ (2) timeout이 λ§Œλ£Œν•˜κΈ° 전에 호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜μ—ˆλ‹€. signal(7) μ°Έκ³ .
EINVAL
epfdκ°€ epoll 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆκ±°λ‚˜, maxeventsκ°€ 0보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

VERSIONS

컀널 버전 2.6μ—μ„œ epoll_wait()이 μΆ”κ°€λ˜μ—ˆλ‹€. glibc 버전 2.3.2λΆ€ν„° 라이브러리 지원을 μ œκ³΅ν•œλ‹€.

λ¦¬λˆ…μŠ€ 컀널 2.6.19μ—μ„œ epoll_pwait()이 μΆ”κ°€λ˜μ—ˆλ‹€. glibc 버전 2.6λΆ€ν„° 라이브러리 지원을 μ œκ³΅ν•œλ‹€.

CONFORMING TO

epoll_wait()은 λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€.

NOTES

ν•œ μŠ€λ ˆλ“œκ°€ epoll_pwait() 호좜 λ‚΄μ—μ„œ 블둝 돼 μžˆλŠ” λ™μ•ˆ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ κ·Έ epoll μΈμŠ€ν„΄μŠ€μ— 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μΆ”κ°€ν•˜λŠ” 게 κ°€λŠ₯ν•˜λ‹€. μƒˆ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ€€λΉ„ μƒνƒœκ°€ 되면 epoll_wait() 호좜의 블둝이 ν’€λ¦¬κ²Œ λœλ‹€.

epoll_wait() 호좜 μ‹œ maxevents 개λ₯Ό λ„˜λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ€€λΉ„ μƒνƒœμ΄λ©΄ μ΄μ–΄μ§€λŠ” epoll_wait() ν˜ΈμΆœμ—μ„œ μ€€λΉ„ μƒνƒœ 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ λΌμš΄λ“œ 둜빈으둜 μ²˜λ¦¬ν•˜κ²Œ λœλ‹€. 이 λ™μž‘μ€ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ€€λΉ„ μƒνƒœλΌκ³  μ•Œκ³  μžˆλŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ— μ§‘μ€‘ν•˜λŠλΌ μ€€λΉ„ μƒνƒœμΈ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ 더 μžˆλ‹€λŠ” κ±Έ μ•Œμ•„μ±„μ§€ λͺ»ν•΄μ„œ λ°œμƒν•˜λŠ” κΈ°μ•„ 상황을 ν”Όν•˜λŠ” 데 도움이 λœλ‹€.

참고둜 관심 λͺ©λ‘μ΄ ν˜„μž¬ λΉ„μ–΄ μžˆλŠ” (λ˜λŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«κ±°λ‚˜ 관심 λͺ©λ‘μ—μ„œ μ œκ±°ν•΄μ„œ 관심 λͺ©λ‘μ΄ λΉ„κ²Œ λ˜λŠ”) epoll μΈμŠ€ν„΄μŠ€μ—λ„ epoll_wait() 호좜이 κ°€λŠ₯ν•˜λ‹€. 이후 (λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ) 관심 λͺ©λ‘μ— μ–΄λ–€ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μΆ”κ°€ν•˜κ³  κ·Έ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ€€λΉ„ μƒνƒœκ°€ 될 λ•ŒκΉŒμ§€ 호좜이 블둝 ν•˜κ²Œ λœλ‹€.

BUGS

컀널 2.6.37 μ „μ—μ„œλŠ” timeout 값이 μ•½ LONG_MAX / HZ λ°€λ¦¬μ΄ˆλ³΄λ‹€ 크면 -1으둜 (즉 λ¬΄ν•œμœΌλ‘œ) μ²˜λ¦¬ν•œλ‹€. κ·Έλž˜μ„œ κ°€λ Ή sizeof(long)이 4이고 컀널 HZ 값이 1000인 μ‹œμŠ€ν…œμ΄λΌλ©΄ 35.79 뢄보닀 큰 νƒ€μž„μ•„μ›ƒμ„ λ¬΄ν•œμœΌλ‘œ μ²˜λ¦¬ν•œλ‹€.

C 라이브러리/컀널 차이

μ§„μ§œ epoll_pwait() μ‹œμŠ€ν…œ ν˜ΈμΆœμ—λŠ” μ—¬μ„― 번째 인자 size_t sigsetsizeκ°€ μžˆλŠ”λ°, μ΄λŠ” sigmask 인자의 λ°”μ΄νŠΈ λ‹¨μœ„ 크기λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. glibc의 epoll_pwait() 래퍼 ν•¨μˆ˜μ—μ„œ 이 인자λ₯Ό κ³ μ •λœ κ°’(sizeof(sigset_t))으둜 μ§€μ •ν•œλ‹€.

SEE ALSO

epoll_create(2), epoll_ctl(2), epoll(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️