2013-07-01 81 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是可讀的,但是,如果它不是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行中或做其他事時超時。當fd可讀時,event將始終被觸發。