使用libevent2处理文件I / O的问题

时间:2011-03-28 09:24:23

标签: linux file libevent

我和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(),这里不适用。

提前致谢。

3 个答案:

答案 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)

答案 2 :(得分:1)

如果你想做异步磁盘i / o,你可能想检查aio_ *系列(参见man(3)aio_read)。它是POSIX.1-2001,可在linux和bsd上使用(至少)。

用于将aio操作与libevent集成,请参阅libevent aio patchrelated stackoverflow post提及使用signalfd(2)将aio信号事件路由到文件描述符,该文件描述符可用于各种fd事件轮询实现(所以与libevent循环一起隐含)。

编辑:libevent也有信号处理支持(完全忘记了),所以你可以尝试注册/处理来自libevent循环的aio信号。如果您的开发规则允许,我会亲自去尝试一下libevent补丁。