2013-07-01 6 views
2

Я пишу программу и использую libevent.libevent: событие таймаута не срабатывает

добавить событие

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 10000; 
... 
... 
event_set(&ev, fd, EV_READ|EV_TIMEOUT|EV_PERSIST, callback, NULL); 
event_add(&ev, &tv); 

, но я заметил, что, если я заменю & телевизор с NULL, а именно я не хочу событие тайм-аута, то программа работает нормально, событие ev срабатывает, когда fd читается, однако, если это &tv не NULL, событие запускается только в первый раз, когда fd доступен для чтения.

В чем причина этого? что значение тайм-аута слишком мало? Какое минимальное значение таймаута для libevent, epoll, select. и т.д?

спасибо!

ответ

1

Что об этом, libevent timeout sample

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <event.h> 

#define BUFSIZE 256 
#define TIMEOUT_SEC 3 

void read_handler(int fd, short event, void *arg) 
{ 
    char buffer[BUFSIZE]; 
    ssize_t read_len; 
    read_len = read(fd, buffer, BUFSIZE); 
    buffer[read_len] = '\0'; 
    printf("%s", buffer); 
} 

void event_handler(int fd, short event, void *arg) 
{ 
    if (event & EV_TIMEOUT) { 
    printf("timeout\n"); 
    //exit(1); 
    } else if (event & EV_READ) { 
    read_handler(fd, event, arg); 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    struct event_base *ev_base; 
    struct event *ev; 
    struct timeval tv; 

    tv.tv_sec = TIMEOUT_SEC; 
    tv.tv_usec = 0; 

    ev_base = event_base_new(); 
    ev = event_new(ev_base, 
       fileno(stdin), 
       EV_TIMEOUT | EV_READ | EV_PERSIST, 
       event_handler, 
       NULL); 
    event_add(ev, &tv); 
    event_base_dispatch(ev_base); 

    event_free(ev); 
    event_base_free(ev_base); 

    return 0; 
} 

Просто удалите код "выход (1)" в строке 22 или делать что-то другое, когда тайм-аут. event будет всегда срабатывать, когда fd доступен для чтения.