我正在编写程序并使用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
替换& tv,即我不想要超时事件,那么程序运行正常,{{1}触发事件ev
但是,如果fd
不是NULL,则该事件仅在&tv
可读时第一次触发。
这是什么原因?是超时值太小了吗? libevent,epoll,select的最小超时值是多少。等等?
谢谢!
答案 0 :(得分: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;
}
只需删除第22行中的代码“exit(1)”或在超时时执行其他操作。event
可读时始终会触发fd
。