libevent EVLOOP_NO_EXIT_ON_EMPTY不工作?

我不明白EVLOOP_NO_EXIT_ON_EMPTY标志应该如何在libevent的2.1.x版本中工作。

如果我没有向event_base添加任何事件

event_base_loop(my_base, EVLOOP_NO_EXIT_ON_EMPTY); 

呼叫立即返回,这根本不是我认为它应该做的。

如果我添加一个事件,它会循环播放该事件,直到它处于活动状态,然后循环退出,我希望不会发生。

目标:

打开命名管道并解读读取。 每当我

 echo "something" > pipe 

应该调用注册的回调。 如果回调已完成,则事件将返回到挂起状态,并且循环等待另一个回显。

这是我到目前为止所得到的:(错误检查省略)

 #include  #include  #include  #include  #include  #include  #define PIPE "/tmp/ev_pipe" void cb_func(evutil_socket_t fd, short what, void *arg) { printf("foo\n"); } int main(void) { /* create & open named pipe */ mkfifo(PIPE, 0666); int socket = open(PIPE, O_RDONLY | O_NONBLOCK); /* libevent specific stuff */ struct event_base *ev_base = event_base_new(); struct event *ev = event_new(ev_base, (evutil_socket_t) socket, EV_READ, cb_func, NULL); event_add(ev, NULL); /* loop forever */ event_base_loop(ev_base, EVLOOP_NO_EXIT_ON_EMPTY); printf("a\n"); /* clean up */ unlink(PIPE); event_base_free(ev_base); close(socket); return 0; } 

我错过了什么? 第一次写入队列后,事件循环退出:/

谢谢你的帮助!

该function的实现看起来有点儿! 我在2.1.x版本遇到了同样的问题。 绕过这个问题的一种方法是@Wizzard指出的。 绕过该问题的另一种方法是将EV_PERSIST标志为函数event_new的events参数:

 struct event *ev = event_new(ev_base, (evutil_socket_t) socket, EV_READ|EV_PERSIST, cb_func, NULL); 

这样可以防止事件被删除。 https://github.com/libevent/libevent/blob/master/include/event2/event.h +872

请注意,当管道上有数据时,您可能会收到多个回调。

只需使用event_base_dispatch (ev_base); 而不是event_base_loop ()``, it will loop and handle all attached events either until you explicitly delete all attached events or call event_base_loopbreak()“`函数。