5

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

提前致谢。

4

3 回答 3

7

我需要 libevent 来阅读许多有关优先级的文件。问题出在 epoll 而不是 libevent 中。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,它完全支持我想要的文件。

谢谢大家的回答。

于 2011-03-29T11:25:47.213 回答
2

用 .注册常规文件描述符是没有意义的libevent与常规文件关联的文件描述符应始终为准备读取、准备写入和错误条件选择 true。

于 2011-03-28T09:57:29.047 回答
1

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

要将 aio 操作与 libevent 集成,请参阅libevent aio 补丁相关的 stackoverflow 帖子,其中提到使用 signalfd(2) 将 aio 信号事件路由到文件描述符,该文件描述符可与各种 fd 事件轮询实现一起使用(因此隐式与 libevent 循环一起使用) .

编辑:libevent 还具有信号处理支持(完全忘记了),因此您可以尝试使用/来自 libevent 循环直接注册/处理 aio 信号。如果您的开发规则允许,我会亲自去尝试 libevent 补丁。

于 2011-03-28T09:48:47.567 回答