2011-08-15 2 views
0

epoll을 사용하여 지연된 코드 실행 또는 시간 초과 이벤트를 어떻게 만들 수 있습니까? libevent와 libev 모두 기능을 가지고 있지만 epoll을 사용하여이 작업을 수행하는 방법을 알 수는 없습니다.epoll 메인 루프를 사용하여 지연 실행

현재 메인 루프는 다음과 같습니다

epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock_fd, &epev); 

while(1) { 
    int nfds = epoll_wait(epfd, &epev, 1, 10); 
    if (nfds < 0) exit(EXIT_FAILURE); 
    if (nfds > 0) { 
     // If an event has been recieved 
    } 
    // Do this every 10ms 
} 

나는이 기능은 단순히 경과 된 시간을 추가하지만, 청소기 솔루션처럼 보인다는 epoll을 사용하여 달성 될 수 있다는 것을 잘 알고 있습니다.

답변

1

당신은 timerfd을 만들고 난 그냥 그 일의 청소기는 epoll 방법을 원 쓴 것처럼에 epoll_wait

+0

고마워,이게 내가 원한거야! – Hobblin

-1

어리석은 질문 : 시간을 정확히 추적하지 않는 이유는 무엇입니까? 나는 (보내는 하트 비트) 다중 TCP 클라이언트에서이 작업을 수행 루프가 기본적으로 수행합니다

uint64_t last = get_time_in_usec(); 
uint64_t event_interval = 10 * 1000; 
while(1) { 
    int nfds = epoll_wait(epfd, &epev, 1, 0); /* note that i set timeout = 0 */ 
    if (nfds <= 0) { /* do some cleanup logic, handle EAGAIN */ 
    if (nfds > 0) { /* If an event has been received */ } 
    if(get_time_in_usec() >= last + event_interval) { ... } 
} 

get_time_in_usec 리눅스에서 gettimeofday 또는 rdtsc을 사용하여 구현 될 수있다. YMMV

+0

에 파일 설명을 추가 할 수 있지만 예, 이것은 내가보기로하고 다른 방법입니다 수 있습니다. 적절한 시간 내에 다른 사람이 게시되지 않으면이 대답을 수락합니다. – Hobblin

+0

요점은 루프가 0 타임 아웃을 가질 수 있다는 것입니다. –

+2

이 접근법은 아무런 이유없이 CPU를 100 %로로드합니다. 당신은 자고 싶을 때 회전하지 않아야합니다. –

관련 문제