Network programming libevent:未触发超时事件

Network programming libevent:未触发超时事件,network-programming,epoll,libevent,Network Programming,Epoll,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替换&tv,即我不想要超时事件,那么程序工作正常,当fd可读时触发事件ev,但是,如果

我正在编写一个程序并使用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,即我不想要超时事件,那么程序工作正常,当
fd
可读时触发事件
ev
,但是,如果它是
&tv
非NULL,则只有当
fd
可读时才触发事件

这是什么原因?是否超时值太小? libevent、epoll和select的最小超时值是多少。等等

谢谢

这个呢

#包括
#包括
#包括
#包括
#定义bufsize256
#第3节定义超时
void read_处理程序(int fd、短事件、void*arg)
{
字符缓冲区[BUFSIZE];
请阅读;
read_len=读取(fd、缓冲区、BUFSIZE);
缓冲区[读取长度]='\0';
printf(“%s”,缓冲区);
}
void事件处理程序(int-fd、短事件、void*arg)
{
if(事件和EV_超时){
printf(“超时\n”);
//出口(1);
}else if(事件和EV_读取){
read_处理程序(fd、event、arg);
}
}
int main(int argc,const char*argv[]
{
结构事件库*ev库;
结构事件*ev;
结构时间值电视;
tv.tv_sec=超时_sec;
tv.tv_usec=0;
ev_base=事件_base_new();
ev=新事件(ev基础,
文件编号(标准输入),
EV|U超时| EV|U读取| EV|U持续,
事件处理程序,
无效);
事件添加(电动汽车和电视);
事件基地调度(ev基地);
无事件(ev);
无事件基础(ev基础);
返回0;
}
只需删除第22行中的代码“exit(1)”,或者在超时时执行其他操作。
fd
可读时,将始终触发
event

#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;
}