2

我正在编写一个程序并使用 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);

但我注意到,如果我将 &tv 替换为NULL,即我不想要超时事件,那么程序工作正常,事件ev在可读时触发fd,但是,如果它&tv不是 NULL,则仅触发事件第一次何时fd可读。

这是什么原因?是超时值太小吗?libevent、epoll、select 的最小超时值是多少?ETC?

谢谢!

4

1 回答 1

1

这个怎么样,libevent超时示例

#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可读时触发。

于 2013-09-05T02:57:11.727 回答