我不明白 EVLOOP_NO_EXIT_ON_EMPTY 标志应该如何在 libevent 的 2.1.x 版本中工作。
如果我不向我的 event_base 添加任何事件
event_base_loop(my_base, EVLOOP_NO_EXIT_ON_EMPTY);
call 立即返回,这根本不是我认为应该做的。
如果我添加一个事件,它会与该未决事件循环,直到它被激活,然后循环退出,我希望不会发生。
目标:
有一个命名管道打开和 libevent 监听读取。每当我
echo "something" > pipe
应该调用注册的回调。如果回调已完成,则事件将返回到挂起状态,并且循环等待另一个回显。
这是我到目前为止得到的:(省略了错误检查)
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <event.h>
#include <unistd.h>
#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;
}
我错过了什么?事件循环在第一次写入队列后退出:/
谢谢你的帮助!