我和libevent2合作了一段时间,但通常我用它来处理网络I / O(使用套接字)。现在我需要阅读许多不同的文件,所以我也想使用它。我创建了这段代码:
int file = open(filename, O_RDONLY);
struct event *ev_file_read = event_new(ev_base, file, EV_READ | EV_PERSIST, read_file, NULL);
if(event_add(ev_file_read, NULL))
error("adding file event");
不幸的是它不起作用。我在尝试添加事件时收到此消息:
[警告] fd 7上的Epoll ADD(1)失败了。旧事件为0;读取更改为1(添加);写入更改为0(无):不允许操作 添加文件事件:不允许操作
该文件存在且具有读/写权限。
任何人都知道如何使用libevent处理文件IO?我还想到了缓冲事件,但在API中只有函数bufferevent_socket_new(),这里不适用。
提前致谢。
答案 0 :(得分:6)
我需要libevent来阅读有关优先级的许多文件。问题在于epoll不是在解放。 Epoll不支持常规Unix文件。
要解决这个问题,我强迫libevent不要使用epoll:
struct event_config *cfg = event_config_new();
event_config_avoid_method(cfg, "epoll");
ev_base = event_base_new_with_config(cfg);
event_config_free(cfg);
首选项列表中的下一个方法是poll,它完全支持文件,就像我想要的那样。
谢谢大家的回答。
答案 1 :(得分:2)
使用libevent
注册常规文件描述符没有意义。 File descriptors associated with regular files shall always select true for ready to read, ready to write, and error conditions.
答案 2 :(得分:1)
如果你想做异步磁盘i / o,你可能想检查aio_ *系列(参见man(3)aio_read)。它是POSIX.1-2001,可在linux和bsd上使用(至少)。
用于将aio操作与libevent集成,请参阅libevent aio patch和related stackoverflow post提及使用signalfd(2)将aio信号事件路由到文件描述符,该文件描述符可用于各种fd事件轮询实现(所以与libevent循环一起隐含)。
编辑:libevent也有信号处理支持(完全忘记了),所以你可以尝试注册/处理来自libevent循环的aio信号。如果您的开发规则允许,我会亲自去尝试一下libevent补丁。