LINUX에서 네트워크 이벤트를 처리하기 위해 사용하는 방식으로 epoll을 많이 사용한다.
장점이 많은데 epoll의 장점 중 하나가 EPOLLONESHOT이라는 플레그가 있다.
EPOLLONESHOT의 용도는 이벤트가 발생될때 한번만 발생되고, 대기상태로 진입하게 하는 특성을 가진다.
그런데, 문제가 하나 있다.
- 이벤트가 발생된 이후에, 이벤트를 재 설정(epoll_ctl(EPOLL_CTL_MOD)) 하면서 발생하게 된다.
- 설정 이후에, 소켓의 이벤트가 발생되지 않는 문제가 바로 그것이다.
이는 최근 커널에서 EPOLLWAKEUP 으로 해결이 되었는데, 지원하지 않은 경우는 다음 방식을 사용하면 된다.
ioctl(fd, FIONREAD, &nread);
단, 소켓에서만 해당 syscall을 사용할수 있다.