Задержка выполнения с использованием основного цикла epoll - PullRequest
0 голосов
/ 16 августа 2011

Как бы я создал отложенное выполнение кода или событий тайм-аута, используя epoll?И libevent, и libev обладают функциональностью, но я не могу понять, как это сделать с помощью 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 кажется более чистым решением.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Вы можете создать timerfd и добавить дескриптор файла в epoll_wait

0 голосов
/ 16 августа 2011

Глупый вопрос: почему бы просто не следить за временем явно? Я делаю это в многопротокольном клиенте (для отправки тактов) и цикл по существу делает:

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 в Linux. YMMV

...