#epoll #file-descriptor #linux #filesystem #fs-file

epoll-rs

对 Linux 的 epoll 接口的面向高级别的绑定

3 个版本

0.2.2 2023 年 8 月 10 日
0.2.1 2021 年 8 月 13 日
0.2.0 2021 年 8 月 11 日

#841 in Unix APIs


miku-rpc 中使用

MIT/Apache

29KB
455 行代码(不包括注释)

Epoll-rs

是什么?

Epoll-rs 是对 Linux 的 epoll 接口的难以误用的高级绑定。它提供了一个 Epoll 类型,它封装了一个 epoll 文件描述符,就像 std::fs::File 封装了常规文件描述符一样。

为什么

epoll 太底层。它是对 epoll 的安全封装,因此不需要使用不安全的代码,但它有一些锋利的边缘,比如需要使用 epoll::close 而不是在 drop 时自动调用 close,并让 API 消费者只与 RawFd 而不是 File 交互。

Mio 太复杂了,因为它旨在支持多个平台,而 epoll-rs 则不是。

如何使用它?

请参阅示例目录和顶级 API 文档


lib.rs:

一个易于使用且难以误用的 Rust 包装器,用于 Linux 的 epoll 接口。

使用 Epoll::new 创建一个新的 epoll 实例。使用 Epoll::add 添加任何实现了 OwnedRawFd 特性的结构体。epoll::add 返回一个 Token,它接管了添加的文件。

use epoll_rs::{Epoll, Opts};
let mut epoll = Epoll::new()?;
let token = epoll.add(file, Opts::IN)?;

来自一个 epoll 实例的令牌不能与另一个实例一起使用。这样做将在调试模式下引发 panic,并在发布模式下产生未定义的行为。

use epoll_rs::{Epoll, Opts};
let mut epoll1 = Epoll::new()?;
let mut epoll2 = Epoll::new()?;
let token1 = epoll1.add(file, Opts::IN)?;
let res = epoll2.remove(token1); // <- undefined behavior in release mode

依赖项

~145KB